917

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

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

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

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

我们有 staging stash和所有以确保提交是完全原子的,您不应该能够轻松撤消这些原子提交中的一个或多个吗?

4

4 回答 4

1409

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

于 2010-02-23T14:31:16.063 回答
433

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

如果您只想要修改后的文件而不是 auto-commit,您可以使用--no-commit

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

这与-n

% git revert -n <commit hash>
于 2013-05-16T22:50:43.043 回答
45

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

于 2010-02-23T14:28:46.613 回答
8

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

  • git revert <commit> -m 1
  • git revert <commit> -m 2
于 2020-03-27T06:34:52.273 回答