撤销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 revert
是git cherry-pick
的反面 - 后者将补丁应用于缺少它的分支,前者将其从具有它的分支中移除。
我不喜欢git revert
做的auto-commit,所以这可能对一些人有帮助。
如果你只是想修改文件而不是自动提交 ,你可以使用--no-commit
% git revert --no-commit <commit hash>
这与-n
相同
% git revert -n <commit hash>
因为它已经被推送,所以你不应该直接操纵历史。 git revert
将使用新的提交来恢复提交中的特定更改,以便不处理提交历史记录。
上一篇: Undo a particular commit in Git that's been pushed to remote repos