【问题标题】:Git: how to reverse-merge a commit?Git:如何反向合并提交?
【发布时间】:2010-12-21 00:52:56
【问题描述】:

使用 SVN 很容易反向合并提交,但如何使用 Git 来实现呢?

【问题讨论】:

标签: git merge


【解决方案1】:

要恢复 merge 提交,您需要使用:git revert -m <parent number>。例如,要使用编号为 1 的父级恢复最近的合并提交,您可以使用:

git revert -m 1 HEAD

要在最后一次提交之前恢复合并提交,您可以:

git revert -m 1 HEAD^

使用git show <merge commit SHA1>查看父母,编号是他们出现的顺序,例如Merge: e4c54b3 4725ad2

git 合并文档: http://schacon.github.com/git/git-merge.html

git 合并讨论(令人困惑但非常详细): http://schacon.github.com/git/howto/revert-a-faulty-merge.txt

【讨论】:

  • 如何获取与父级关联的“数字”?分支是否有固有的数字“id”?
  • 使用git show <merge commit SHA1>查看父母,编号是他们出现的顺序,例如Merge: e4c54b3 4725ad2
  • 示例:git revert -m 1 SHA1 该命令对我有用,可以恢复合并提交,该合并提交是 head 之前的几个合并提交,并且下面有许多提交。
  • 父母是谁?e4c54b3 还是 4725ad2?
  • @cowlinator 运行 git help revert 并查看 -m 标志说:此选项指定主线的父编号(从 1 开始)并允许 revert 以反转相对于指定的父级。 虽然要小心 b/c,但它也说:还原合并提交声明您将永远希望合并带来的树更改。因此,以后的合并将仅引入不是先前恢复的合并的祖先的提交引入的树更改。
【解决方案2】:

要创建一个“撤消”过去提交的更改的新提交,请使用:

$ git revert <commit-hash>

也可以通过变基然后重置从过去的任意点实际删除提交,但是如果您已经将提交推送到另一个存储库(或者其他人已经拉取),您真的不想这样做来自你)。

如果您之前的提交是合并提交,您可以运行此命令

$ git revert -m 1 <commit-hash>

请参阅schacon.github.com/git/howto/revert-a-faulty-merge.txt 了解重新合并未合并分支的正确方法

【讨论】:

  • 您可能需要向git revert 提供-m &lt;parent number&gt; 选项以指定要还原的更改。如果要撤消未发布历史记录的合并,请使用git reset --hard HEAD^1
  • Jakub:如果您要恢复合并提交,那是真的,但在 Subversion 术语中,“reverse-merge”实际上只是恢复任何类型提交的名称。
  • 请注意,使用-m 意味着来自未合并分支的未来合并将不包括合并之前的更改!请参阅schacon.github.com/git/howto/revert-a-faulty-merge.txt 了解重新合并未合并分支的正确方法。
  • 超链接已损坏。应该在未来证明答案。
【解决方案3】:

如果我理解正确,你说的是做一个

svn merge -rn:n-1

要退出较早的提交,在这种情况下,您可能正在寻找

git revert

【讨论】:

    【解决方案4】:
    git reset --hard HEAD^ 
    

    使用上述命令恢复合并更改。

    【讨论】:

    • 这会丢弃合并提交,它不会按照原始发布者的要求进行。 OP 正在尝试做一个反向补丁来撤消以前的更改,而不是完全删除以前更改的历史记录。
    【解决方案5】:

    如果您不想提交,或者想稍后提交(提交消息仍会为您准备好,您也可以编辑):

    git revert -n <commit>
    

    【讨论】:

      猜你喜欢
      • 2012-05-08
      • 1970-01-01
      • 2016-06-09
      • 2010-11-29
      • 2016-05-22
      • 2018-11-29
      • 2011-04-03
      • 1970-01-01
      • 2011-06-23
      相关资源
      最近更新 更多