Git reflog

Git 進階

Amanda Crawford-Adamo

Software and Data Engineer

什麼是 Git Reflog?

  1. 本機記錄版本庫中「所有」參考更新。
  2. Reflog 儲存在本機的 .git/logs/refs/heads/ 目錄下
  3. 記錄分支頂端與 HEAD 位置的變更
  4. 為 Git 操作提供防護網
  5. 協助復原誤改或誤刪

Git 歷史變更的範例圖

Git 進階

Git Reflog 與 Git Log 比較

功能 Git Reflog Git Log
目的 顯示本機版本庫中的參考更新與改寫 只顯示提交紀錄
範圍 僅本機版本庫 本機與遠端版本庫
內容 所有參考更新(commit、reset、merge 等) 只有 commit
保存性 暫時(通常 90 天) 永久(屬於版本庫歷史)
使用情境 復原遺失的提交、理解近期操作 檢視專案歷史、了解功能開發
Git 進階

Reflog 指令

  • 顯示日誌資料與 HEAD 活動
    git reflog
    git reflog show
    
  • 清理舊日誌或不可達條目
    git reflog expire
    
Git 進階

Reflog 輸出結構

reflog 輸出文字結構分解

終端機中的 reflog 輸出範例

元件 說明
short-hash 縮寫的提交雜湊
ref 通常為 HEAD,也可能是分支名稱
index 在 reflog 中的位置(0 為最新)
action 操作類型(commit、reset、merge 等)
descriptions 關於該操作的描述
1 https://hackernoon.com/time-to-rewrite-your-git-history-effectively-with-git-reflog
Git 進階

篩選:since 與 until

  • since = 從此時間點之後的條目

    git reflog --since "time-qualifer"
    
  • until = 截至此時間點為止的條目

    git reflog --until "time-qualifer"
    
用法
git reflog --since="1 week ago"
git reflog --until="yesterday"
git reflog --until="2024-01-01"
Git 進階

復原被刪除的分支

情境

  • 建立了一個名為 etl-feature 的分支
  • 將 ETL 功能的變更提交到此分支
  • 不小心刪除了這個分支
  • 所有程式碼變更都不見了

「要如何還原 etl-feature 分支?」

解法

  1. git reflog 找出被刪分支頂端提交的 hash
  2. 使用 git checkout 將 HEAD 移到該提交雜湊
  3. 以目前 HEAD 指向的提交建立一個新分支
git reflog
git checkout <hash>
git checkout -b <branch-name>
1 https://stackoverflow.com/questions/3640764/can-i-recover-a-branch-after-its-deletion-in-git
Git 進階

Git Reset

  • 將 HEAD 移到指定的提交物件。
  • 視 reset 類型而定,工作區與暫存區會被更新。
Reset 類型 指令 對工作目錄的影響 對暫存區的影響
Soft git reset --soft <commit> 無變更 變更維持已暫存
Mixed(預設) git reset --mixed <commit> 無變更 變更變為未暫存
Hard git reset --hard <commit> 變更被捨棄 變更被捨棄
Git 進階

尋找遺失的提交

情境

  • 在多次提交與 rebase 後測試開始失敗
  • 不明的提交導致失敗
  • 需要回復到可通過的狀態

「要如何回到先前可通過的 ETL 腳本變更?」

解法

  1. 用 Git Reflog 找出刪除的提交雜湊
  2. 使用 git reset 回到測試通過的提交
git reflog
git reset --soft HEAD@{1}
Git 進階

最佳實務

  • 對復原遺失的程式碼與提交很有幫助
  • 撰寫具描述性的提交訊息
  • 規律推送到遠端
  • 小心使用強制推送

出錯時,Reflog 就像本機的時光機

一個可倒轉時間的時鐘圖像

Git 進階

一起來練習吧!

Git 進階

Preparing Video For Download...