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

我怎样才能以一种易于回滚的方式进行git合并?,git,merge,rollback,undo,feature-branch,Git,Merge,Rollback,Undo,Feature Branch,有很多关于如何在git中“撤销”合并的讨论。简短版本:如果撤消合并提交,它还会告诉git以后不要再合并这些更改 在进行合并时,我可以做些什么来缓解这个问题吗?在很多情况下,撤销合并将非常非常有用,仅在软件开发的正常过程中,更重要的是,在控制发布分支的状态时,需要回滚更改 编辑 我已经看到了解决方案,并没有真的认为它是一个解决方案,更多的是对问题的解释。它需要 始终使用--no-ff 记住,当您想要返回依赖于它们的代码时(可能是几小时、几天、几周或几个月以后……),所有未完成的合并都要记住 我想要

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

在进行合并时,我可以做些什么来缓解这个问题吗?在很多情况下,撤销合并将非常非常有用,仅在软件开发的正常过程中,更重要的是,在控制发布分支的状态时,需要回滚更改

编辑

我已经看到了解决方案,并没有真的认为它是一个解决方案,更多的是对问题的解释。它需要

  • 始终使用--no-ff
  • 记住,当您想要返回依赖于它们的代码时(可能是几小时、几天、几周或几个月以后……),所有未完成的合并都要记住
  • 我想要什么

    下面是它在Subversion中的工作方式。假设我有一个名为“release-candidate”的分支,这是我们在登台服务器上运行的分支,我们在那里尝试功能。假设我合并到一个分支中。在Subversion中,它是一个变更集,并且合并了所有文件的所有历史记录。假设我们不喜欢它,所以我们想把它拿出来。我们只需撤销单个变更集,不必考虑其他任何事情。我们可以在将来的任何时候重新合并功能分支A,而不必记住我们曾经将其合并并取出过

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

    更新:

    此处提供了一个工作流,可以更轻松地使用每个功能的分支:


    (问题的SVN部分已在末尾得到回答)

    是的,以下是如何重新引入未合并的功能。考虑下面的历史(假设你已经撤销了一个合并):

    F是特征分支,M是合并,U是取消合并该特征时的相反值,L是最新提交

    以下是您的选择:

  • 恢复U(无
    ——强制执行推压所需的力):

  • 将F重设为L(然后合并
    --ff only F'
    )(无
    --force
    推送所需):

  • 将F重设为L(然后合并
    --无ff F'
    --保留新的分支点)(无--推送所需的力):

  • rebase-i head^
    并从列表中删除U
    ——强制
    需要推动)

    x---x----x--x---x--M--L
         \            /
          x--x--x--x-F
    
  • rebase--on M^1 L^L
    以摆脱合并和取消合并。现在你可以稍后再回忆

                      L'
                     /
    x---x----x--x---x--M--U--L
         \            /
          x--x--x--x-F
    
  • 要压缩所有功能提交,请在初始合并时使用
    --squash
    修改器。我会让你的想象力来研究这在历史上会是什么样子。我不建议这样做是有原因的。了解功能是如何工作的以及它采取了哪些步骤是有价值的。后续的合并将更容易,因为Git可以检查某个文件看起来像它的历史。将提交挤压在一起会丢失该信息

    还有一些额外的缺点,可能会也可能不会影响您利用历史重演的能力

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

    查看git流


    希望这能为您提供更多详细信息。

    有什么原因您不能使用git reset--硬原版头回滚提交?我的答案需要更多信息吗?urschrei:如果我在服务器上的分支上这样做,那么要推送结果,我必须使用
    --force
    ,对吗?好的,那么我的问题的答案是“你不能这么做”,但是adymitruk对事后的选择做了很好的概述。我真的需要知道你的问题是什么。在git中没有什么是svn做不到的。。。或多或少。这是对我的选择的一个很好的概述,但我的问题是,在最初的合并时,我是否可以做些什么来让事情变得更简单。我刚刚用“我想要什么”部分更新了我的问题。在你的回答中:这是4个不同的选项,对吗?想给他们编号吗?另外,如果所有分支都是远程发布的,那么哪些分支需要
    --force
    ?如果您将这些标记为…“假设您已经“取消”了合并”--这是否意味着,
    git revert
    ?另外--想在您的答案中做一些注释吗--没有ff?(与它进行合并总是很理想的,使它们更容易恢复,对吗?)git flow看起来很酷,但似乎与未合并和重新合并没有任何关系。我错过什么了吗?
    x---x----x--x---x--M--U--L
         \            /       \
          x--x--x--x-x         x'--x'--x'--x'--F'
    
    x---x----x--x---x--M--U--L-------------------M2
         \            /       \                 /
          x--x--x--x-x         x'--x'--x'--x'--F'
    
    x---x----x--x---x--M--L
         \            /
          x--x--x--x-F
    
                      L'
                     /
    x---x----x--x---x--M--U--L
         \            /
          x--x--x--x-F