所以我有/trunk
,所有金色的东西最终都会被提交。我有一个主题分支,/topicA
。
通常,您将/topicA
合并到trunk中,它将是一次提交。万岁!要撤消此合并,您只需反向合并此合并引起的提交。容易腻。
现在,假设我有/topicA
并将其合并到/trunk
...但是我有一个与/topicA
相关的错误修正。那么,我应该再次承诺/topicA
吗?我甚至可以重新合并/topicA
,以便/trunk
包含/topicA
。但是如何轻松地回滚所有/topicA
,原创作品和错误修正?
提交历史记录:
/topicA
/topicA
/topicA
/topicA
合并到/trunk
/topicA
/topicA
重新合并到/trunk
以获取错误修正/topicA
/topicA
/topicA
重新合并到/trunk
以获取错误修正/topicA
,包括错误修正)我知道你可以解开每个错误修复然后初始合并,但这看起来并不性感。
git也有答案吗?
答案 0 :(得分:2)
您可以使用
重写历史记录git rebase --interactive --preserve-merges <hash before first merge>
这将打开您的默认文本编辑器,其中包含一些提交,包括您的合并。从编辑器中出现的列表中删除所有合并并保存,然后退出。 git将重放所有提交,不包括您删除的提交,从而重写历史记录。您的/ topicA分支仍然存在,因此您只需将其合并到卡车中即可。
它有助于所有合并在交互式编辑器中都有“合并分支”字样,因此很容易识别它们。
以下是在虚构存储库上发布命令后购买的编辑器中的文本示例
pick 07c2942 Added "Hello" to README
pick e98e38b Added "There" to README
pick e3d66ad Added "Here" to README
pick 2105946 Merge branches 'master' and 'tmp'
您不希望合并发生,因此您可以简单地删除该行以及它之前的行,因为在这种情况下它是合并的一部分。
pick 07c2942 Added "Hello" to README
pick e98e38b Added "There" to README
保存并退出,git现在将重播这些提交,减去合并。
请注意,您可以删除任何行,并且将从存储库中删除该提交。您也可以将提交重新排列为您喜欢的任何顺序。如果您在中间合并,则可以将它们剪切并粘贴到最后。
答案 1 :(得分:1)
在我们的项目中,我们再保留一个分支,直到完成集成(在您的情况下为trunk_plus_topicA)。它是从后备箱创建的。我们合并到它从主干和主题A提交。
然后,在完成集成测试后,我们确定我们需要topicA,整个topicA_plus_trunk会合并到trunk中(或者你可以用trunk_plus_topicA替换trunk)。
在canse中,当topicA将仅合并到主干(或根本不合并)时,您不需要额外的分支。您可以简单地将提交从主干合并到topicA。在topicA中进行错误修正,集成和测试,最后将它们全部合并到主干中。
正如我的朋友所说 - “修复破碎板最简单的方法就是不要先制造它。” 这个建议在现实生活中并不适用,但在软件工程中经常使用。
答案 2 :(得分:0)
如果您还没有同时合并任何其他作品,可以使用git reset --hard <sha-1>
将工作树重置为较旧的时间,然后在{{topicA
之上重新合并trunk
1}}。
答案 3 :(得分:0)
不幸的是,这可能没有简单的答案。它确实取决于提交是否已被推送,因此对其他开发人员(他们可能已经基于他们的工作)“公开”。
如果提交被推送,你唯一真正的解决办法就是做一堆恢复并推送它们。
否则,您可以在第一次合并之前重置选项,完成topicA上的错误修正,然后在完成所有操作后合并(如X-Istence建议的那样)。
作为一项规则,我们的团队通常会在将主题分支合并到我们的“主干”并推送(我们也宣传使用squash合并,因此它们都在一次提交中)时终止主题分支。然后任何错误修正只适用于“主干”本身。如果主题分支不应该登陆,我们总是可以从提交中重新生成主题分支,然后还原合并。开发人员然后躲避,在该主题上做更多的工作以使其更稳定,并尝试在以后合并它。
答案 4 :(得分:0)
您可以使用以下命令恢复每个合并:
git revert -m 1 <id of second remerge>
git revert -m 1 <id of first remerge>
git revert -m 1 <id of first merge>
但是如果您想在此之后的某个时刻合并topicA,请务必在执行此操作前阅读http://www.kernel.org/pub/software/scm/git/docs/howto/revert-a-faulty-merge.txt。
答案 5 :(得分:0)
在第一次将分支合并到它之前,将主干恢复到之前。然后将与您所做的分支无关的每个更改重新合并到主干。
这远非优雅或理想或“性感”,但可以比取消合并分支更改更容易,具体取决于在树干上与分支无关的工作量。