撤销一个特定的提交的最简单的方法是:

不是在头部或头部 一直被推到遥控器。

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

git reset HEAD

是行不通的。因为它被推到了遥控器,

git rebase -i

and

git rebase --onto

遥控器会出问题的。

更重要的是,我不想修改历史。如果有糟糕的代码,它就在历史记录中,可以被看到。我只想在工作副本中取出它,我不介意反向合并提交。

换句话说,Git中等价于以下svn命令的是什么:

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

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

svn merge -c -302 ^/trunk

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

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

我们有暂存和所有来确保提交是完全原子的,你不应该能够轻易撤销一个或多个原子提交吗?


因为它已经被推了,你不应该直接操纵历史。Git revert将使用新的提交来恢复提交中的特定更改,这样就不会操纵提交历史。


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


我不喜欢自动提交,git恢复做,所以这可能是有帮助的一些。

如果你只是想要修改的文件而不是自动提交,你可以使用——no-commit

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

和-n是一样的

% git revert -n <commit hash>

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

Git回复<commit> -m 1 Git回复<commit> -m 2