撤消已被推送到远程存储库的Git中的特定提交


788

撤消特定提交的最简单方法是:

  • 不在头部或头部
  • 已被推到远程。

因为如果不是最新提交,

git reset HEAD

不起作用。而且由于它已经被推到了遥远的地方,

git rebase -i

git rebase --onto

会在遥控器上造成一些问题。

更何况,我真的不想修改历史记录。如果有错误的代码,它就存在于历史中并且可以看到。我只想在工作副本中删除它,并且不介意反向合并提交。

换句话说,以下svn命令的Git等效项是什么:

svn merge -r 303:295 http://svn.example.com/repos/calc/trunk

通过将这些修订中的所有更改反向合并为新提交,从而将所有更改从295删除为302。

svn merge -c -302 ^/trunk

当然可以通过添加另一个提交来撤消302提交,该提交将反向合并来自相应提交的更改。

我认为这在Git中应该是一个相当简单的操作,并且是一个相当普遍的用例。原子提交还有什么意义呢?

我们已经举办藏起来,并要保证的提交是完全原子,你不应该能够解开其中一个或多个原子提交的容易吗?

Answers:


1210

使用标识提交的哈希git log,然后使用git revert <commit>来创建一个删除这些更改的新提交。在某种程度上,git revert是相反的git cherry-pick-后者将补丁应用到缺少补丁的分支,前者将补丁从具有补丁的分支中删除。


237
如果需要返回代码,但又不想自动再次提交,请使用-n开关
jaygooby 2011年

17
“ m”选项有什么作用?我尝试了git revert 8213f7d,但是却得到了这个:错误:提交8213f7dad1ed546b434a0d8a64cb783b530a5a30是一个合并但没有给出-m选项。致命:还原失败
马尔科姆

10
还原合并:git revert -m 1 <hash>
brunozrk 2014年

31
对任何想要还原合并的人发出警告:git revert将撤消所有数据更改(即,文件更改将被还原),但是合并仍保留在历史记录中。因此,如果您稍后尝试再次合并同一分支,则在还原合并之前,它将不包括来自合并分支的任何提交。这很可能不是您想要的。为了再次完全合并分支,您将需要首先在还原原始合并的位置还原提交。这里了解更多:kernel.mirrors.pair.com/pub/software/scm/git/docs/howto/...
etreworgy

3
由@etreworgy评论的链接是404。我怀疑这是一个到链接的最新版本:kernel.org/pub/software/scm/git/docs/howto/...
蒂姆·史密斯

368

我不喜欢自动提交git revert功能,因此这对某些人可能会有所帮助。

如果只希望修改后的文件不自动提交,则可以使用--no-commit

% git revert --no-commit <commit hash>

这与 -n

% git revert -n <commit hash>

9
git reset HEAD~1 --soft如果您已经在没有回复的情况下也可以进行操作-n
Daniel

1
但是git reset HEAD~n无法解决无法从头部连续到达的任何提交的撤消。该查询将还原任何特定的提交。
sangeethkumarp

我使用了此解决方案,但在还原过程中遇到了冲突。解决冲突后,我git revert --continue按照指示进行。它奏效了,但遗憾地承诺了结果。也许我需要做git revert --no-commit --continue
mareoraft

1
@sangeethkumarp Daniel的评论是您之后可以采取的另一步骤git revert,如果您忘记了-n; 因为在那一点上,最后一次提交是还原,所以软重置将撤消该提交,但不会撤销还原的相关代码更改
Oliver

@Daniel为我提供了通过评论工作提供的解决方案感谢很多“ git reset HEAD〜1 --soft”
Sayed

41

因为它已经被推送,所以您不应该直接操纵历史。git revert将使用新的提交从提交中还原特定的更改,以便不操纵提交历史记录。


1

如果要还原的提交是合并的提交(已经被合并),则您应该选择-m 1-m 2选择,如下所示。这将让git知道要使用合并提交的哪个父提交。更多细节可以在这里找到。

  • git revert <commit> -m 1
  • git revert <commit> -m 2
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.