这在很大程度上取决于您所说的“还原”是什么意思。
暂时切换到不同的提交
如果你想暂时回到它,鬼混,然后回到你所在的地方,你所要做的就是检查所需的提交:
# This will detach your HEAD, that is, leave you with no branch checked out:
git checkout 0d1d7fc32
或者,如果您想在那里进行提交,请继续并在您使用时创建一个新分支:
git checkout -b old-state 0d1d7fc32
要回到你所在的位置,只需再次检查你所在的分支。(如果您进行了更改,就像在切换分支时一样,您必须酌情处理它们。您可以重置以丢弃它们;您可以存储、结帐、存储弹出以将它们随身携带;您可以提交如果你想在那里有一个分支,他们可以去那里的一个分支。)
硬删除未发布的提交
另一方面,如果你想真正摆脱从那时起所做的一切,有两种可能性。一,如果您还没有发布任何这些提交,只需重置:
# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32
# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
如果你搞砸了,你已经丢弃了你的本地更改,但你至少可以通过再次重置来恢复到以前的位置。
使用新提交撤消已发布的提交
另一方面,如果您已经发布了作品,您可能不想重置分支,因为这实际上是在重写历史。在这种情况下,您确实可以还原提交。对于 Git,revert 有一个非常具体的含义:创建一个带有反向补丁的提交以取消它。这样你就不会重写任何历史。
# This will create three separate revert commits:
git revert a867b4af 25eee4ca 0766c053
# It also takes ranges. This will revert the last two commits:
git revert HEAD~2..HEAD
#Similarly, you can revert a range of commits using commit hashes (non inclusive of first hash):
git revert 0d1d7fc..a867b4a
# Reverting a merge commit
git revert -m 1 <merge_commit_sha>
# To get just one, you could use `rebase -i` to squash them afterwards
# Or, you could do it manually (be sure to do this at top level of the repo)
# get your index and work tree into the desired state, without changing HEAD:
git checkout 0d1d7fc32 .
# Then commit. Be sure and write a good message describing what you just did
git commit
git-revert
手册页实际上在其描述中涵盖了很多内容。另一个有用的链接是讨论 git-revert 的 git-scm.com 部分。
如果您决定根本不想恢复,您可以恢复恢复(如此处所述)或重置回恢复之前(参见上一节)。
在这种情况下,您可能还会发现此答案很有帮助:
如何将 HEAD 移回以前的位置?(分离的头)和撤消提交