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

时间:2010-02-23 14:21:09

标签: git version-control git-reset git-revert

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

  • 不在头部或HEAD
  • 已被推到遥控器。

因为如果它不是最新的提交,

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操作和一个相当常见的用例。原子提交还有什么意义?

我们已经暂存stashing以确保提交完全是原子的,您是否应该能够轻松撤消这些原子提交中的一个或多个?

4 个答案:

答案 0 :(得分:1087)

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

答案 1 :(得分:337)

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

如果您只想让修改后的文件不是自动提交,则可以使用--no-commit

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

-n

相同
% git revert -n <commit hash>

答案 2 :(得分:35)

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

答案 3 :(得分:4)

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

  • git revert <commit> -m 1
  • git revert <commit> -m 2