git之reflog命令的使用
作者:一户董
写在前面
本文一起看下reflog命令。
1:场景描述
在开发的过程中,因为修改错误,想要通过git reset命令恢复到之前的某个版本,但是选择提交ID错误,导致多恢复了一个版本,假定,该版本对应的内容还没有push到远端仓库,并且该提交十分重要,可能决定了一个将要倒闭的公司是否能够继续 苟延残喘
,怎么办?肯定要恢复回来,git reflog就可以帮你轻松搞定。本文从纯命令操作方式和sourcetree界面操作方式来进行模拟。
2:纯命令操作
2.1:初始化git仓库
$ pwd /d/test/testreflog JHP+Administrator@jhp MINGW64 /d/test/testreflog $ git init Initialized empty Git repository in D:/test/testreflog/.git/
2.2:执行3次提交
添加a.txt并提交
$ touch a.txt JHP+Administrator@jhp MINGW64 /d/test/testreflog (master) $ echo "a" > a.txt JHP+Administrator@jhp MINGW64 /d/test/testreflog (master) $ git add a.txt warning: LF will be replaced by CRLF in a.txt. The file will have its original line endings in your working directory JHP+Administrator@jhp MINGW64 /d/test/testreflog (master) $ git commit -m'add a.txt' [master (root-commit) 0c70790] add a.txt 1 file changed, 1 insertion(+) create mode 100644 a.txt
添加b.txt并提交
$ touch b.txt JHP+Administrator@jhp MINGW64 /d/test/testreflog (master) $ echo 'b' > b.txt JHP+Administrator@jhp MINGW64 /d/test/testreflog (master) $ git add b.txt warning: LF will be replaced by CRLF in b.txt. The file will have its original line endings in your working directory JHP+Administrator@jhp MINGW64 /d/test/testreflog (master) $ git commit -m'add b.txt' [master b68fdbe] add b.txt 1 file changed, 1 insertion(+) create mode 100644 b.txt
添加c.txt并提交
$ touch c.txt JHP+Administrator@jhp MINGW64 /d/test/testreflog (master) $ echo 'c' > c.txt JHP+Administrator@jhp MINGW64 /d/test/testreflog (master) $ git add c.txt warning: LF will be replaced by CRLF in c.txt. The file will have its original line endings in your working directory JHP+Administrator@jhp MINGW64 /d/test/testreflog (master) $ git commit -m'add c.txt' [master 1b263f8] add c.txt 1 file changed, 1 insertion(+) create mode 100644 c.txt
查看提交日志
$ git log -9 --pretty=oneline 1b263f8227fbb8050cee5bde301c11fa6a4d3467 (HEAD -> master) add c.txt b68fdbe04611a68e16f538f1efb63727c1fc5e64 add b.txt 0c70790e7d7b54a582c81defe27a49b47df1e6db add a.txt
模拟错误操作
假定 add c.txt
是我们误操作,因此我们需要执行命令 git reset --hard b68fdbe046
来恢复到其之前的一个版本,但是操作失误,一直还原到了 add a.txt
对应的提交,如下:
$ git reset --hard 0c70790e7d7b HEAD is now at 0c70790 add a.txt JHP+Administrator@jhp MINGW64 /d/test/testreflog (master) $ git log -n9 --pretty=oneline 0c70790e7d7b54a582c81defe27a49b47df1e6db (HEAD -> master) add a.txt
在准备工作中,当我们执行 git reset --hard
后,被恢复代码之后的提交通过git log就看不到了,但是git reflog其实是可以看到的,因为该命令看到的是进行过的所有的操作,对比如下图:
如下:
$ git reflog -n9 --pretty=oneline 0c70790 (HEAD -> master) HEAD@{0}: reset: moving to 0c70790e7d7b 1b263f8 HEAD@{1}: reset: moving to HEAD 1b263f8 HEAD@{2}: commit: add c.txt b68fdbe HEAD@{3}: commit: add b.txt 0c70790 (HEAD -> master) HEAD@{4}: commit (initial): add a.txt
注意这里的 HEAD@{n}
表示head指针在n次移动之前的情况,比如我们要恢复到 add b.txt
的提交,只需要执行如下操作即可:
$ git reset --hard HEAD@{3} HEAD is now at b68fdbe add b.txt JHP+Administrator@jhp MINGW64 /d/test/testreflog (master) $ git log -n3 --pretty=oneline b68fdbe04611a68e16f538f1efb63727c1fc5e64 (HEAD -> master) add b.txt 0c70790e7d7b54a582c81defe27a49b47df1e6db add a.txt
3:sourcetree界面操作
3.1:初始化git仓库
git init
。
3.2:使用sourcetree打开仓库
然后选择仓库的文件夹即可。
此时因为我们什么也没有做,所以信息都是空的。
3.3:创建文件a.txt并提交
$ touch a.txt JHP+Administrator@jhp MINGW64 /d/test/testreflog (master) $ echo "a" > a.txt
暂存并提交:
接着同样的方式,添加b.txt,c.txt,最终如下图:
3.4:模拟错误操作
假定 add c.txt
是我们误操作,因此我们需要恢复到其之前的一个版本,但是操作失误,一直还原到了add a.txt
对应的提交,如下:
3.5:恢复操作
同命令行方式。这里sourcetree没有提交对应的UI操作。
写在后面
参考文章列表
【学了就忘】Git操作 — 51.git reflog命令 。
到此这篇关于git之reflog命令的使用的文章就介绍到这了,更多相关git reflog命令内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!