git reflog讲解

描述

git-reflog是用来恢复本地错误操作很重要的一个命令,所以在这里对它进行一下整理。

语法

$ git reflog <subcommand>  <options>

具体用法

$ git reflog [show] [log-options] [<ref>]
$ git reflog expire [--expire=<time>]  [--expire-unreachable=<time>] [--rewrite] [--updateref] [--stale-fix]  [--dry-run|-n] [--verbose] [--all|<refs>…​]
$ git reflog delete [--rewrite] [--updateref] [--dry-run|-n] [--verbose]  ref@{specifier}…​
$ git reflog exists <ref>

git log是显示当前的HEAD和它的祖先的,递归是沿着当前指针的父亲,父亲的父亲,……,这样的原则。
git reflog根本不遍历HEAD的祖先。它是HEAD所指向的一个顺序的提交列表:它的undo历史。reflog并不是repo(仓库)的一部分,它单独存储,而且不包含在pushesfetches或者clones里面,它纯属是本地的。
reflog可以很好地帮助你恢复你误操作的数据,例如你错误地reset了一个旧的提交,或者rebase,……,这个时候你可以使用reflog去查看在误操作之前的信息,并且使用git reset --hard 去恢复之前的状态。

HEAD@{2}表示HEAD指针在两次移动之前的情况;而 master@{one.week.ago}表示master在本地仓库一周之前的情况。

实例: 显示HEADreflog

$ git reflog show
ef64f10 (HEAD  -> BlueLake_theme) HEAD@{0}: commit: 新增ethereum-programming-intr oduction
122e0ec (origin/BlueLake_theme) HEAD@{1}: commit: 移除了冗余的ethereum-rationale 文章
c17fbbb HEAD@{2}: commit: 新增git-change-server-password文章
1603d1a HEAD@{3}: pull: Merge made by the 'recursive' strategy. 
0ce1e93 HEAD@{4}: commit: 新增了以太坊原理
c73503c HEAD@{5}: commit: 修改了-X-Frame-Options的关键字
6af02f6 HEAD@{6}: commit: 新增了git-tag的文章;修改了git其他的文章,规范了名字、 关键字
9087fbd HEAD@{7}: commit: 新增了gti-reset文章
039d95c HEAD@{8}: commit: 移除了没用的目录
ff72601 HEAD@{9}: commit: 修改成了next主题
ef64f10 (HEAD  -> BlueLake_theme) HEAD@{0}: commit: 新增ethereum-programming-intr

从上图可以看到,几乎所有的操作都记录在其中,这个就像MySQL,随时可以回滚。

“expire”子命令会删除掉更老的reflog条目。

“delete”子命令从reflog中删除一个条目。

“exists”子命令检查一个ref是否有一个reflog。

参考

https://git-scm.com/docs/git-reflog

posted @ 2021-12-12 01:33  Appleex  阅读(393)  评论(0编辑  收藏  举报