在工作中,我在创建提交消息时使用我的工作电子邮件地址,但是在家里,我使用私人帐户来创建提交。
我忘记在提交和推送之前改回到我的工作电子邮件地址,然后我意识到我用自己的私人电子邮件地址推送了一个Merge
提交,我希望将此提交消息基本上修改为我的工作电子邮件地址。 br />
在Git
中,当我需要从某些子提交重新确定基础然后强行推入它时,这非常容易,但它工作得很好,但是在Mercurial
中,它似乎受到了更多限制,我很确定必须顺便说一句,正如我在Stackoverflow中看到许多类似的问题(例如修改提交)一样,我还使用一些著名的Mercurial扩展阅读了一些文章,例如:histedit
,evolve
和rebase
。
我尝试过的其他操作也失败了:
hgext.convert
创建一个我不想要的新存储库
而且在我的变更集中之一也没能完成。histedit
会引发错误,它无法修改公共更改。hgext.mq
会引发错误,提示它无法导入合并
修订。为什么在汞方面如此复杂?
我也查看过的其中一篇文章是
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
。
答案 0 :(得分:3)
一种可能的解决方案是重新创建要更改的提交,然后将其后的所有内容重新建立为该新提交。
仅当您知道有害提交已传播到的所有克隆,并且能够直接对其进行修改时,此方法才有效。
假设您具有以下历史记录:
%>%
其中B是错误的提交。
步骤:
将本地更改还原为与B相同
(例如,在THG中,您可以右键单击历史记录,然后选择“还原所有文件...”)
解决原始问题-即正确设置电子邮件地址
提交。现在您的历史记录如下:
A-B-C-D
将C重新设置为B'(A-B-C-D
\
B'
命令-THG对此也有屏幕)。所以现在您有了:
hg rebase ...
使用A-B
\
B'-C-D
(仅适用于本地克隆)删除原始B
hg strip
使用A-B'-C-D
(1)
推
(1)只有在您有权访问这些克隆并且在修订版D之后没有任何人提交任何内容时,这才有可能。或者,如果可以访问,则可以对其进行变基或从中删除它。方式。
也请谨慎使用hg strip
,因为它具有破坏性。