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

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

  • 不是在头部或头部
  • 已经被推到了遥控器上。

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

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

我们有暂存藏匿和所有确保提交是完美的原子,你不应该能够轻松撤消一个或多个原子提交吗?

482800 次浏览

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

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

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

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

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

这与-n相同

% git revert -n <commit hash>

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

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