【Git】git reset –hard可以恢复到原始状态的故事🤖

首先

我目前在一所编程学校学习,目标是转行成为网络工程师。在编程中有一样不可避免的东西,那就是Git。对于初学者来说,在使用Git时可能会经常犯错。

本次将介绍如何在执行git reset –hard后恢复重置的提交。

给繁忙的人的超简要概述
搞砸了的人?『哇、、、』
某猫?『是不小心在hard模式下重置了吧!?』
某赛亚人?『没问题,可以用reflog和reset命令弄回来』

目标人群

    プログラミング初学者の方
请注意,前提是您理解如何使用git reset命令来撤销更改,因此我将省略对git reset命令的详细说明。

用中文将以下内容转述一遍,只需要一个选项:

git reset –hard

示例答案:
强制还原 git 清空

重置索引和工作树。之后对工作树中跟踪文件的所有更改都将被丢弃。

 

就像标题所说,即使使用–hard选项重置,也可以还原回原样。

注意! 只限于已经提交的情况下!

使用以下提到的git reflog命令可以查看并显示HEAD指针的移动记录,但无法查看和显示未提交的更改(在工作目录或暂存区中未提交的更改)。执行git reset –hard命令会删除未提交的更改,所以无法使用git reflog和git reset来撤销这些更改,因此需要进行提交。

现在的情况

目前,有五个提交。

$ git log --oneline

b7fef5e (HEAD -> main) Bakutan_R_kun
e1cdb3c Fall_in_love
b418c51 Flog
b3ce313 Fox
5bd80c8 Big_Bang

将提交还原到之前的状态

假设我们想要回退到倒数第二个提交(b418c51 Flog)时的状态,我们可以执行 git reset –hard HEAD~2 命令。这将撤销最近的两个提交。

$ git reset --hard HEAD~2
HEAD is now at b418c51 Flog

$ git log --oneline

b418c51 (HEAD -> main) Flog
b3ce313 Fox
5bd80c8 Big_Bang

后来,我还是后悔撤销了提交…
我想要恢复回去…!

通过使用`git reflog`和`git reset –hard`命令来解决问题(主题)。

当需要回到原来的状态时,可以使用git reset –hard命令。

需要在 “hard” 后面指定提交ID,但是由于在Git log命令中只会显示当前存在的提交,所以需要先使用git reflog命令。

git reflog
Git 引用日志

参考记录(reflog)是指 HEAD 或分支的移动历史记录,在每个个人的本地仓库中存在。它记录了分支切换、新添加的更改拉取、历史记录重写,或者仅仅是执行新的提交等操作。使用git reflog可以查看HEAD的移动历史记录,使用git reflog <分支名>可以查看该分支指向的提交的列表。(引自下方网站)

总结一下git reflog。

运行reflog命令后,顶部的日志中显示了reset: moving to HEAD~2。由于这是执行git reset –hard命令时的日志,所以如果我们指定它的前一个提交ID b7fef5e,应该就可以了。(reflog是reference log的缩写)

$ git reflog
b418c51 (HEAD -> main) HEAD@{0}: reset: moving to HEAD~2
b7fef5e HEAD@{1}: commit: Bakutan_R_kun  #←このコミットIDを指定
e1cdb3c HEAD@{2}: commit: Fall_in_love
b418c51 (HEAD -> main) HEAD@{3}: commit: Flog
b3ce313 HEAD@{4}: commit: Fox
5bd80c8 HEAD@{5}: commit (initial): Big_Bang

使用指定的提交ID(b7fef5e),执行git reset –hard命令。

git reset --hard b7fef5e
HEAD is now at b7fef5e Bakutan_R_kun

查看日志后,已成功恢复原状?

git log --oneline
b7fef5e (HEAD -> main) Bakutan_R_kun #←復活
e1cdb3c Fall_in_love #←復活
b418c51 Flog
b3ce313 Fox
5bd80c8 Big_Bang

最后

所有Git的记录都由位于根目录下的.git目录进行管理。如果不小心删除了.git目录,将无法恢复(因为本地的更改历史也会丢失)…!

尽管这次的情况与之不同,但git reflog在删除未合并的分支时也很有用。

如果有任何错误,请在评论中指出,将不胜感激。

文献引用

    • Git コマンドリファレンス(日本語版) – git reset

 

    • git公式リファレンス – git reflog

 

    • git reflog についてまとめてみる

 

    git reset –hard を取り消す、git reflog の使い方
广告
将在 10 秒后关闭
bannerAds