【Git】git reset –hard可以恢复到原始状态的故事🤖
首先
我目前在一所编程学校学习,目标是转行成为网络工程师。在编程中有一样不可避免的东西,那就是Git。对于初学者来说,在使用Git时可能会经常犯错。
本次将介绍如何在执行git reset –hard后恢复重置的提交。
搞砸了的人?『哇、、、』
某猫?『是不小心在hard模式下重置了吧!?』
某赛亚人?『没问题,可以用reflog和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 の使い方