这在很大程度上取决于你对“revert”一词的理解。
暂时切换到不同的提交
如果你想暂时回到某个提交,进行一些试验,然后再回到当前位置,你只需要检出所需的提交即可:
git checkout 0d1d7fc32
或者,如果你想在那里提交代码,顺便创建一个新的分支:
git checkout -b old-state 0d1d7fc32
要回到之前的地方,只需再次查看你所在的分支即可。(如果你做了更改,切换分支时通常需要处理这些更改。你可以重置以丢弃它们;你可以存储、切换、存储弹出以携带它们;如果你想在那里创建一个分支,你也可以将它们提交到一个分支上。)
彻底删除未发布的提交
另一方面,如果你真的想摆脱自从那时以来所做的一切,有两种可能性。一种是,如果你没有发布这些提交中的任何一个,只需简单地重置:
git reset --hard 0d1d7fc32
git stash
git reset --hard 0d1d7fc32
git stash pop
如果你搞砸了,你已经丢掉了你的本地更改,但你至少可以通过重新设置来回到之前的状态。
用新的提交撤销已发布的提交
另一方面,如果你已经发布了工作,你可能不想重置分支,因为那实际上是重写历史。在这种情况下,你确实可以撤销提交。在许多企业组织中,“受保护”的分支的概念甚至会阻止在一些重要分支上重写历史。在这种情况下,撤销是你唯一的选择。
在Git中,撤销有一个非常具体的意义:创建一个相反的补丁来取消它。这样你就不会重写任何历史。
首先确定要撤销的提交。根据下面选择的技术,你要么只撤销合并提交,要么只撤销非合并提交。
# This lists all merge commits between 0d1d7fc and HEAD:
git log --merges --pretty=format:"%h" 0d1d7fc..HEAD | tr '\n' ' '
# This lists all non merge commits between 0d1d7fc and HEAD:
git log --no-merges --pretty=format:"%h" 0d1d7fc..HEAD | tr '\n' ' '
git revert a867b4af 25eee4ca 0766c053
git revert HEAD~2..HEAD
git revert 0d1d7fc..a867b4a
git revert -m 1 <merge_commit_sha>
git checkout 0d1d7fc32 .
git commit
实际上,git-revert
manpage在其描述中涵盖了很多内容。另一个有用的链接是这个git-scm.com部分讨论git-revert。
如果你决定不想撤销,你可以撤销撤销(如此处所述),或者回到撤销之前的状态(参见前一部分)。
在这种情况下,你可能还会发现这个答案有帮助:
如何将HEAD移回到以前的位置?(分离的HEAD)和撤销提交