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