【发布时间】:2018-12-11 13:42:22
【问题描述】:
在工作中,我在创建提交消息时使用我的工作电子邮件地址,但在家里我使用我的私人帐户来创建提交。
在提交和推送之前,我忘记改回我的工作电子邮件地址,然后我意识到我用我的私人电子邮件地址推送了 Merge 提交,我想基本上将此提交消息修改到我的工作电子邮件地址。
在Git 中,当我需要从某个子提交变基然后强制推送它时非常容易,它工作得非常好,但在Mercurial 中,它似乎受到更多限制,我很确定一定有办法,当我在 Stackoverflow 中看到许多类似的问题(例如修改提交)时,我还阅读了一些使用一些著名的 Mercurial 扩展的文章,例如:histedit、evolve 和 rebase。
我尝试的其他一些事情也失败了:
- 使用
hgext.convert创建一个我不想要的新存储库 而且它也未能在我的一个变更集中完成。 - 使用
histedit会引发无法修改公共更改的错误。 - 使用
hgext.mq会抛出无法导入合并的错误 修订。
为什么在 mercurial 中如此复杂?
我也查过的一篇文章是这样的:
https://book.mercurial-scm.org/read/changing-history.html
请注意,我已经理解它的含义以及当其他人在此存储库上工作时它会有多么危险,所以请尝试从我这里保存它:)
另一个注意事项,我通常使用SourceTree,有时使用命令行,所以如果你是那种 SourceTree 人,我也很乐意听到你的解决方案。
并且请尽量避免将此问题标记为重复,因为我已经使用过搜索并且看到了许多不同的解决方案并没有真正澄清这一点。
是否有与Git 类似的方式,基本上从特定提交重新设置并强制推送,以便我可以将我的电子邮件更改回我的工作电子邮件地址?
提前感谢您花费时间和精力提供帮助! :)
编辑 1:
我尝试使用基于@DaveInCaz 解决方案的推送更改在测试公共存储库上重现它,但失败了:
步骤:
// Updating to the wrong commit message.
hg update -r B
// Throwing all changes that has been made on the wrong commit.
hg strip B
// Re-creating the Merge again with the correct mail address.
hg merge new-feature
// Assuming now it creates revision B2
hg commit -m 'Merge'
// Pulling the changes again
hg pull
// Making the correct commits afterwards to be the children from B2 instead B.
hg rebase -s C -d B2
// Removing the old B
hg strip B
当然,如果我尝试hg push,我会得到以下abort: push creates new remote head。
【问题讨论】:
-
转换扩展失败将是一个错误。进化扩展应该能够做到这一点(干净,通过过时的原始发布提交;您将拥有原始提交及其替换,在这种情况下,这对于您的目的可能是不必要的)。您还可以强制将提交的 阶段 从已发布更改为草稿或机密,然后使用 histedit。这可能是最简单也是最好的方法。
-
我看到你把git标签放回去了。我认为它不属于这里:您的问题不是 关于 Git,您只是将 Git 用作您希望事情如何工作的参考。 (同时,您是否尝试过强制阶段回到轮抽?注意:您可能还希望在任何推动的目标上执行此操作。这就是进化的优势所在:减少手动操作。)
-
您可以使用
hg phase -f draft <revs>将给定的修订设置回草稿阶段。然后,您可以根据需要编辑它们。请注意,如果您已将它们转移到另一个 hg 存储库,那么您也必须将它们从该存储库中删除。如果它们在尖端,您可以安全地剥离它们;如果没有,请确保您正在操作的任何存储库都具有所有后续提交,以便您可以剥离所有内容并将其从经过手术更改的现在正确的存储库中放回。 (当然,如果他们不在草稿阶段,这通常意味着您已经转移了他们。) -
Evolve 应该有帮助,虽然我从未使用过它。从功能上讲,evolve 背后的想法是新的提交可以超过之前的提交,从而将其隐藏起来。旧的提交仍然存在,并被转移到所有其他克隆,但所有使用进化扩展的克隆都知道过时的提交已经过时,新的替换是要使用的。这里的缺点是每个存储库都必须支持扩展。
标签: mercurial commit atlassian-sourcetree tortoisehg