Git:如何反向合并提交?


Answers:


105

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

$ git revert <commit>

实际上,也可以通过重新设置基准然后重新设置从过去的任意点删除提交,但是如果您已经将提交推送到另一个存储库(或者其他人从您那里拉出了),则您确实不想这样做。 。


31
您可能需要提供-m <parent number>选项git revert以指定要还原的更改。如果要撤消未发布历史的合并,请使用git reset --hard HEAD^1
JakubNarębski09年

3
Jakub:如果要还原合并提交,这是正确的,但是在Subversion术语中,“反向合并”实际上只是用于还原任何类型提交的名称。
本·詹姆斯

4
请注意,使用-m意味着来自未合并分支的将来合并将不包括该合并之前的更改!有关重新合并未合并分支的正确方法,请参见schacon.github.com/git/howto/revert-a-faulty-merge.txt
马丁·彼得斯

125

要还原合并提交,您需要使用: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 merge文档:http : //schacon.github.com/git/git-merge.html

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


36
您如何获得与父母相关的“数字”?分支是否具有固有数字“ id”?
daniyalzade 2011年

7
git show <merge commit SHA1>看父母,编号是他们出现如顺序Merge: e4c54b3 4725ad2
supermethod

8
示例:git revert -m 1 SHA1该命令对我有用,可以还原一个合并提交,该合并提交是在头部之前的多个合并提交,并且在其下具有多个提交。
c.apolzon

3
父母是哪个?e4c54b3或4725ad2?
Dolphin

1
这仍然没有提供足够的信息,关于git show的结果如何与父代数字相关。“它们出现的顺序”是否基于1?从0开始?具体而言,在此示例中,父级1的SHA1是什么?e4c54b3或4725ad2?
cowlinator

4

如果我对您的理解正确,那么您正在谈论做一个

svn merge -rn:n-1

退出先前的提交,在这种情况下,您可能正在寻找

git revert

0
git reset --hard HEAD^ 

使用上面的命令还原合并更改。


3
这会丢弃合并提交,而合并提交不会执行原始发布者要求的操作。OP尝试做一个反向修补程序以撤消以前的更改,而不是完全删除以前的更改的历史记录。

-1

如果您不想提交或以后要提交(仍然会为您准备提交消息,您也可以对其进行编辑):

git revert -n <commit>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.