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 など) コミットのみ
永続性 一時的(通常 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 で特定
  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 種別 コマンド 作業ツリーへの影響 ステージへの影響
Soft git reset --soft <commit> 変更なし 変更はステージ済みのまま
Mixed (既定) git reset --mixed <commit> 変更なし 変更はステージ解除
Hard git reset --hard <commit> 変更を破棄 変更を破棄
高度な Git

失われたコミットの特定

シナリオ

  • コミットやリベース後にテストが失敗
  • 原因のコミットが不明
  • 以前の合格状態に戻したい

直前の ETL スクリプト変更にどう戻す?

解決策

  1. Git Reflog で対象コミットのハッシュを特定
  2. git reset でテスト合格のコミットへ戻す
git reflog
git reset --soft HEAD@{1}
高度な Git

ベストプラクティス

  • 失ったコードやコミットの復旧に強力
  • わかりやすいコミットメッセージを使う
  • こまめにリモートへプッシュ
  • 強制プッシュは慎重に

ミスをしたとき、Reflog はローカルのタイムマシンです

時間が逆行する時計の画像

高度な Git

練習してみましょう!

高度な Git

Preparing Video For Download...