如何将Git存储库恢复到以前的提交?
我如何从当前状态恢复到在某个提交上创建的快照?
如果我做git log
,那么我得到以下输出:
$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <me@me.com>
Date: Thu Nov 4 18:59:41 2010 -0400
blah blah blah...
commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <me@me.com>
Date: Thu Nov 4 05:13:39 2010 -0400
more blah blah blah...
commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <me@me.com>
Date: Thu Nov 4 00:55:06 2010 -0400
And yet more blah blah...
commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <me@me.com>
Date: Wed Nov 3 23:56:08 2010 -0400
Yep, more blah blah.
如何从11月3日恢复到提交,即提交0d1d7fc
?
这很大程度上取决于您“回复”的含义。
暂时切换到另一个提交
如果你想暂时回到它,愚弄,然后回到你所在的位置,你所要做的就是检查所需的提交:
# 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,回复具有非常明确的含义:使用反向修补程序创建提交以将其取消。 这样你就不会重写任何历史。
# 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:
git revert a867b4af..0766c053
# 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移回到以前的位置? (分离头)
将工作副本还原到最近的提交
要恢复到之前的提交,忽略任何更改:
git reset --hard HEAD
HEAD是您当前分支中的最后一个提交
将工作副本恢复到较旧的提交
要恢复比最近提交更早的提交:
# Resets index to former commit; replace '56e05fced' with your commit code
git reset 56e05fced
# Moves pointer back to previous HEAD
git reset --soft HEAD@{1}
git commit -m "Revert to 56e05fced"
# Updates working copy to reflect the new commit
git reset --hard
积分转到类似的堆栈溢出问题,恢复到由Git中的SHA散列提交?
这里有很多复杂而危险的答案,但实际上很简单:
git revert --no-commit 0766c053..HEAD
git commit
这会将所有从HEAD返回的提交散列都恢复,这意味着它将在工作树中重新创建提交状态,就好像每一次提交都已返回一样。 然后你可以提交当前的树,它会创建一个全新的提交,它基本上等同于你“恢复”的提交。
( --no-commit
标志让git立即恢复所有提交 - 否则系统会提示您输入该范围内每次提交的消息,并用不必要的新提交丢弃历史记录。)
这是回滚到以前状态的安全和简单的方法 。 没有历史被破坏,所以它可以用于已经公开的提交。
链接地址: http://www.djcxy.com/p/39.html上一篇: How to revert Git repository to a previous commit?
下一篇: Why is subtracting these two times (in 1927) giving a strange result?