撤消特定提交的最简单方法是:
不在头部或头部
已被推送到远程。
因为如果不是最新的提交,
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 stashing 和所有以确保提交是完全原子的,您不应该能够轻松撤消这些原子提交中的一个或多个吗?
使用 git log
确定提交的哈希,然后使用 git revert <commit>
创建删除这些更改的新提交。在某种程度上,git revert
是 git cherry-pick
的反面——后者将补丁应用于缺少它的分支,前者将其从拥有它的分支中删除。
我不喜欢 git revert
所做的自动提交,因此这可能对某些人有所帮助。
如果您只想修改文件而不是自动提交,您可以使用 --no-commit
% git revert --no-commit <commit hash>
这与 -n
相同
% git revert -n <commit hash>
-n
的情况下恢复,您也可以执行 git reset HEAD~1 --soft
git reset HEAD~n
不会解决任何无法从头部连续到达的提交的撤消问题。查询是恢复任何特定的提交。
git revert --continue
。它奏效了,但遗憾的是承诺了结果。也许我需要做git revert --no-commit --continue
。
git revert
之后采取的额外步骤,如果您忘记了 -n
;因为此时最后一次提交是还原,所以软重置将撤消该提交,但不会撤消还原的相关代码更改
因为它已经被推送了,所以你不应该直接操纵历史。 git revert
将使用新提交恢复来自提交的特定更改,以免操纵提交历史。
如果您要恢复的提交是合并提交(已经合并),那么您应该选择 -m 1
或 -m 2
选项,如下所示。这将使 git 知道要使用合并提交的哪个父提交。更多详细信息,请参见HERE。
git revert <提交> -m 1
git revert <提交> -m 2