协慌网

登录 贡献 社区

撤消已被推送到远程存储库的 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 中一个相当简单的操作,并且是一个相当普遍的用例。原子提交还有什么意义呢?

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

答案

使用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>

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