我怎样才能以易于回滚的方式进行git合并?

时间:2011-01-19 21:55:55

标签: git merge rollback undo feature-branch

有很多关于如何在git中“撤消”合并并不容易的讨论。简短版本:如果撤消合并提交,它还会告诉git以后永远不会将这些更改合并。

在进行合并时我能做些什么来减轻这个问题?在很多情况下,只需在软件开发的正常过程中撤消合并就非常非常有用,更重要的是,在需要回滚更改时控制发布分支的状态。

修改

我在this article中看到了解决方案,并没有真正将其视为解决方案,更多是对问题的解释。它需要

  1. 始终使用--no-ff
  2. 当你想要恢复依赖它们的代码时,记住你所有的撤消合并(这可能是未来几小时,几天,几周或几个月......)
  3. 我想要什么

    以下是它在Subversion中的工作原理。假设我有一个名为“release-candidate”的分支,这是我们在登台服务器上运行的,以及我们在哪里试用功能。假设我在功能A分支中合并。在Subversion中,它只是一个变更集,并且所有文件的所有历史记录都已合并。假设我们不喜欢它,所以我们想把它拿出来。我们只是撤消单个变更集,而不必考虑其他任何事情。我们可以在将来的任何时候将功能分支A合并回来,而不必记住我们在某一时刻将其合并并将其取出。

    我希望能够尽可能接近这一流程。我想优化“不必记住未来的东西”,即使它让事情在某种程度上采取了更多的步骤。 (这可能是不可能的......)

1 个答案:

答案 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是最新的提交。

以下是您的选择:

  1. 还原U(无需--force推送):

    x---x----x--x---x--M--U--L--^U
        \            /
         x--x--x--x-F
    
  2. 将F重新绑定到L(然后合并--ff-only F')(无需--force推送):

    x---x----x--x---x--M--U--L
         \            /       \
          x--x--x--x-x         x'--x'--x'--x'--F'
    
  3. 将F重新绑定到L(然后合并--no-ff F' - 保留新的分支点)(不需要 - 强制推送):

    x---x----x--x---x--M--U--L-------------------M2
         \            /       \                 /
          x--x--x--x-x         x'--x'--x'--x'--F'
    
  4. rebase -i head^^并从列表中删除U (推送需要--force

    x---x----x--x---x--M--L
         \            /
          x--x--x--x-F
    
  5. rebase --onto M^1 L^ L摆脱合并和取消合并。现在你可以稍后重新合并。

                      L'
                     /
    x---x----x--x---x--M--U--L
         \            /
          x--x--x--x-F
    
  6. 要压缩所有功能提交,请在初始合并时使用--squash修饰符。我会让你的想象力在历史上如何看待。有理由我不建议这样做。知道如何使用功能以及采取了哪些步骤是很有价值的。随后的合并将更容易,因为Git可以检查某个文件看起来如何的历史记录。将提交压缩在一起会丢失这些信息。

    还有其他一些缺点可能会影响您利用rerere历史记录的能力,也可能不会影响您的记录。

    我建议始终使用master中的空白合并标记释放的内容。这是通过与--no-ff选项合并完成的。你永远不会在master上工作,那里完成的唯一提交是那些合并 - 没有代码更改提交。在QA分支中,您标记标记您释放点的提交。因此,当您执行git merge --no-ff rc-12.2时,您将自动生成提交注释“merged rc-12.2”。

    查看git-flow。

    希望能为您提供更多细节。