如何将Git仓库还原到之前的提交?

发布时间 2023-10-06 12:54:42作者: 小满独家

内容来自 DOC https://q.houxu6.top/?s=如何将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

要还原到特定的提交,请使用以下命令:

git checkout commit_id

在这种情况下,您应该输入以下内容:

git checkout 0d1d7fc32e5a947fbd92ee598033d85bfc445a50

这将使您的工作目录还原为该提交的状态。请注意,此操作是可逆的,因此如果您在还原后发现有问题,可以随时使用git checkout命令返回到之前的状态。


这取决于你所说的“还原”是什么意思。

临时切换到不同的提交

如果你想暂时回到之前的状态,玩耍一下,然后再回到原来的地方,你只需要检出所需的提交:

git checkout 0d1d7fc32

或者,如果你想在那个位置进行提交,可以在那个位置同时创建一个新的分支:

git checkout -b old-state 0d1d7fc32

要回到原来的地方,只需再次检出所在的分支。(如果你已经更改了分支,就像切换分支时一样,你需要相应地处理它们。你可以重置以丢弃它们;你可以使用储藏、检出、储藏弹出来携带它们;如果你想在那里有一个分支,你可以将它们提交到那里。)

硬删除未发布的提交

另一方面,如果你想真正摆脱自那时以来所做的一切,有两种可能性。一是,如果你没有发布这些提交中的任何一个,只需重置:

git reset --hard 0d1d7fc32

或者,如果有要保留的工作,可以执行以下操作:

git stash
git reset --hard 0d1d7fc32
git stash pop

这将保存修改,然后在重置后重新应用修补程序。

如果你搞砸了,你已经丢掉了本地的更改,但至少可以通过再次重置回到原来的位置。

用新提交撤销已发布的提交

另一方面,如果你已经发布了工作,你可能不想重置分支,因为这会有效地重写历史。在这种情况下,你可以确实撤销提交。使用Git,撤销具有非常特定的含义:创建一个提交,用相反的修补程序取消它。这样,你就不会重写任何历史。

git revert a867b4af 25eee4ca 0766c053

它还可以接受范围。这将撤销最后两个提交:

git revert HEAD~2..HEAD

同样,您可以使用提交哈希(不包括第一个哈希)撤销一系列提交:

git revert 0d1d7fc..a867b4a

撤销合并提交

git revert -m 1 <merge_commit_sha>

要获取其中一个,您可以在之后使用rebase -i压缩它们,或者手动执行(请确保在存储库的顶层执行):

git checkout 0d1d7fc32 .

然后提交。一定要写一个好的消息描述你刚刚做了什么。

git commit

git-revert手册页实际上在描述中涵盖了很多内容。另一个有用的链接是这个git-scm.com部分讨论git-revert

如果你决定最终不想撤销,可以撤销撤销(如此处所述),或重置回撤销之前(请参阅上一部分)。

在这种情况下,你可能会发现这个答案也很有帮助:How can I move HEAD back to a previous location? (Detached head) & Undo commits