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, 發現結果是一樣的

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