有很多关于如何在git中“撤消”合并并不容易的讨论。简短版本:如果撤消合并提交,它还会告诉git以后永远不会将这些更改合并。
在进行合并时我能做些什么来减轻这个问题?在很多情况下,只需在软件开发的正常过程中撤消合并就非常非常有用,更重要的是,在需要回滚更改时控制发布分支的状态。
修改
我在this article中看到了解决方案,并没有真正将其视为解决方案,更多是对问题的解释。它需要
我想要什么
以下是它在Subversion中的工作原理。假设我有一个名为“release-candidate”的分支,这是我们在登台服务器上运行的,以及我们在哪里试用功能。假设我在功能A分支中合并。在Subversion中,它只是一个变更集,并且所有文件的所有历史记录都已合并。假设我们不喜欢它,所以我们想把它拿出来。我们只是撤消单个变更集,而不必考虑其他任何事情。我们可以在将来的任何时候将功能分支A合并回来,而不必记住我们在某一时刻将其合并并将其取出。
我希望能够尽可能接近这一流程。我想优化“不必记住未来的东西”,即使它让事情在某种程度上采取了更多的步骤。 (这可能是不可能的......)
答案 0 :(得分:11)
更新:
使用分支功能更轻松的工作流程在此处:http://dymitruk.com/blog/2012/02/05/branch-per-feature/
(问题的SVN部分已在最后回答)
是的,以下是重新引入您未合并的功能的方法。考虑以下历史记录(假设您已经“解除”合并):
x---x----x--x---x--M--U--L
\ /
x--x--x--x-F
F是功能分支,M是合并,当你取消合并该功能时,U是相反的,L是最新的提交。
以下是您的选择:
还原U(无需--force
推送):
x---x----x--x---x--M--U--L--^U
\ /
x--x--x--x-F
将F重新绑定到L(然后合并--ff-only F'
)(无需--force
推送):
x---x----x--x---x--M--U--L
\ / \
x--x--x--x-x x'--x'--x'--x'--F'
将F重新绑定到L(然后合并--no-ff F'
- 保留新的分支点)(不需要 - 强制推送):
x---x----x--x---x--M--U--L-------------------M2
\ / \ /
x--x--x--x-x x'--x'--x'--x'--F'
rebase -i head^^
并从列表中删除U (推送需要--force
):
x---x----x--x---x--M--L
\ /
x--x--x--x-F
rebase --onto M^1 L^ L
摆脱合并和取消合并。现在你可以稍后重新合并。
L'
/
x---x----x--x---x--M--U--L
\ /
x--x--x--x-F
要压缩所有功能提交,请在初始合并时使用--squash
修饰符。我会让你的想象力在历史上如何看待。有理由我不建议这样做。知道如何使用功能以及采取了哪些步骤是很有价值的。随后的合并将更容易,因为Git可以检查某个文件看起来如何的历史记录。将提交压缩在一起会丢失这些信息。
还有其他一些缺点可能会影响您利用rerere历史记录的能力,也可能不会影响您的记录。
我建议始终使用master中的空白合并标记释放的内容。这是通过与--no-ff
选项合并完成的。你永远不会在master上工作,那里完成的唯一提交是那些合并 - 没有代码更改提交。在QA分支中,您标记标记您释放点的提交。因此,当您执行git merge --no-ff rc-12.2
时,您将自动生成提交注释“merged rc-12.2”。
查看git-flow。
希望能为您提供更多细节。