Git——功能——reflog

  reflog,引用日志,会记录每一种类型引用的变更,有三种类型的引用,tag,stash,HEAD等关键字。最常见的是HEAD的变更记录。

  它应该只用于查看,不应该被删除。它的主要应用场景为查找相关的commit标识,作为其他命令的参数,最常见的为reset。

  官网地址:https://git-scm.com/docs/git-reflog

1、概念

  引用原著中的定义:

  The reflog is a record of changes to the tips of branches within nonbare repositories. Every time an update is made to any ref, including HEAD, the reflog is updated to record how that ref has changed

     reflog命令是用于记录非裸版本库中的引用变更。会引发引用变更的操作有

  1. Cloning(克隆),
  2. Pushing(推送),
  3. Making a new commits(提交),
  4. Changing or creating branches(修改和创建分支),
  5. Rebase(变基)
  6. Reset(重置)

  在实际中查看引用日志, 而不查看提交历史,关键原因在于提交历史找不到,例如删除已合并的分支,reset(重置)等操作覆盖后续的提交等等。

2、操作

  2.1  查询

  执行git reflog show命令查询引用日志。它的语法格式为:

git reflog [show] [log-options] [<ref>]

  show是默认值,可以不写。

  log-options是log命令中的选项。

  ref是引用的ID,例如HEAD@{0},等价于HEAD~1。默认值为HEAD

  2.2  删除

  执行git reflog delete命令删除日志,它的语法格式为:

git reflog delete [--rewrite] [--updateref] [--dry-run | -n] [--verbose] ref@{specifier}

  执行git reflog show,显示结果会发现它的结果类似一个集合,最近一次提交对应的是HEAD@{0},初始提交对应的是HEAD@{N},它代表的是历史提交的次数。

  当执行删除操作时,需要对引用进行更新,类似于数组在中间删除一个元素时,所有的元素都需要往前移动,在中间添加一个元素时,所有的元素都需要往后移动。

  引用日志结果集合也是同样的道理,当删除掉HEAD@{0}时,之后的HEAD@{1},HEAD@{2},HEAD@{3}等都会往前移动,而且它对应的提交对象也不同。

  --rewrite表示重新建立引用与提交之间的关系,例如HEAD@{0},之前的HEAD@{1}需要修改为HEAD@{0},删除与HEAD~1之间的关系,建立与HEAD之间的关系。

  --updateref表示更新引用,它是默认的行为,无需额外添加这个选项。

  --dry-run, -v都为公共选项。

  示例如下:删除HEAD@{0},执行git reflog delete --verbose HEAD@{0},结果如下:

keep commit (initial): 提交文件A.txt
keep reset: moving to HEAD
keep reset: moving to HEAD
keep reset: moving to HEAD
keep reset: moving to HEAD
keep reset: moving to HEAD
keep reset: moving to HEAD
keep reset: moving to HEAD
keep reset: moving to HEAD
prune reset: moving to HEAD

 2.3  过期

  设置引用日志的过期时间,与设置Cookies的过期很类似。它的语法结构如下:

git reflog expire [--expire=<time>] [--expire-unreachable=<time>]
        [--rewrite] [--updateref] [--stale-fix]
        [--dry-run | -n] [--verbose] [--all [--single-worktree] | <refs>…]

  --dry-run, --verbose都是公共的选项

 2.4  判断

  执行git reflog exists <ref>,它不包含后面的@{num}。

  示例:执行git reflog exists none,执行git reflog exists HEAD, 发现结果是一样的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章