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
(仓库)的一部分,它单独存储,而且不包含在pushes
,fetches
或者clones
里面,它纯属是本地的。
reflog
可以很好地帮助你恢复你误操作的数据,例如你错误地reset
了一个旧的提交,或者rebase
,……,这个时候你可以使用reflog
去查看在误操作之前的信息,并且使用git reset --hard
去恢复之前的状态。
HEAD@{2}
表示HEAD
指针在两次移动之前的情况;而 master@{one.week.ago}
表示master
在本地仓库一周之前的情况。
实例: 显示HEAD
的reflog
。
$ 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。