git reflog
命令是用来恢复本地错误操作很重要的一个命令,所以在这里对它进行一下整理。
1、git reflog
命令说明
reflog
翻译:Reference logs
(参考日志)
git reflog
命令:可以叫做显示可引用的历史版本记录。
可引用历史提交版本,什么意思?
-
使用
git log
命令只可以查看到HEAD指针及其之前的版本信息,如果版本发生过回退操作,则可能会出现,HEAD指针之后仍存在历史提交版本的情况,而这些提交版本信息通过git log
命令是看不到的。即:
git log
命令是显示当前的HEAD
和它的祖先,递归是沿着当前指针的父亲,父亲的父亲,……,这样的原则。 我们可以通过使用
git reflog
命令,就可查看到所有历史版本信息。由于查看所有历史版本信息的目的,大多是为了进行版本回退或恢复操作所使用,从中找到所需的commit索引,所以该命令被命名为reflog
,即:引用日志。
git log
命令与git reflog
命令作用范围示意图:
提示:
reflog
并不是Git仓库的一部分,它单独存储,它纯属是本地的。 (git reflog
命令显示的内容,应该是存储在.git/logs/HEAD
文件中,或者是.git/logs/refs
目录中的文件。)也就是说
git reflog
命令中保留了从clone仓库开始,用户所有在本地库中的操作。
2、git reflog
命令显示内容
# 1.查看版本库中历史提交记录
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/amend_test (master)
$ git log --oneline
68d777d (HEAD -> master) 我是第3次提交,重新修改的message
8b3a071 第2次提交,新增内容:git commit --amend v2
d3e2d8c 第1次提交,新增readme.txt文件
# 2.查看可引用的历史提交记录
69a9841 HEAD@{0}: commit (amend): 我是第3次提交,重新修改的message
bd4fd48 HEAD@{1}: commit: 第3次提交,新增内容:git commit --amend v3
8b3a071 HEAD@{2}: commit: 第2次提交,新增内容:git commit --amend v2
d3e2d8c HEAD@{3}: commit (initial): 第1次提交,新增readme.txt文件
从上可以看到,执行git reflog
命令,比执行git log
命令多显示了一条内容。
(是使用git commit --amend
命令追加提交时,覆盖了一条提交记录)
说明:
最前面是历史提交commit-id的前7位,根据这7位可以将版本库恢复到对应节点状态。
HEAD@{n}
:表示HEAD更改历史记录,最新的更改在上面。HEAD@{2}
:表示HEAD
指针在两次移动之前的情况。master@{one.week.ago}
:表示master
分支在本地仓库一周之前的情况。-
通过
HEAD@{n}
语法可以回退到指定的提交。例如:
git reset --hard HEAD@{3}
。 与
HEAD@{n}
与HEAD~n
功能类似,但是HEAD~n
回退的是git log
命令显示的历史提交记录,而HEAD@{n}
回退的是git reflog
命令显示的历史提交记录。最后一个冒号后面的字串为,该提交的说明信息摘要。
3、具体的用法
git reflog
命令具体用法如下:
-
git reflog [show] [log-options] [<ref>]
:就是显示同可引用的历史版本,同git reflog
。就在后边可以加日志的选项。 -
git reflog expire [--expire=<time>] [--expire-unreachable=<time>] [--rewrite] [--updateref] [--stale-fix] [--dry-run | -n] [--verbose] [--all | <refs>…]
:删除掉更老的reflog
条目。 -
git reflog delete [--rewrite] [--updateref] [--dry-run | -n] [--verbose] ref@{specifier}…
:从reflog
中删除一个条目。 -
git reflog exists <ref>
:检查一个ref是否有一个reflog条目。
4、引起ref变化的操作有
所有引起HEAD指针变动的操作,都会被记录在git reflog
命令中。
我们可知,引起HEAD指针变化的操作有:
-
git checkout branchName
:切换分支 。 -
git commit
:提交。 -
git reset commit
:重置。 -
git checkout commit
:签出某一个提交。 -
git merge
:合并操作。 -
git rebase
:基变。 -
git pull
:相当于 fetch + merge 。 -
git pull : Fast-forward
:没有冲突,快速前进。 -
git pull --rebase
:相当于fetch + rebase。 -
git clone
:初始化ref 。
参考: