はじめに
↑ の記事で git blame
便利そ~ git rebase
使い道わからん~hoge~ってやってたんですが、
ありがたいコメントを契機に、一気に理解できたので記事にさせていただきます。
いただいたコメント
私の場合、
git rebase
で コミット整理する際に よく使います。
ちょっとした間違いを修正するときとか
(git commit --amend
の、ずっと前のコミットでも直せる版)。
git rebase
する前に、修正対象コミット を見つけるために、git blame
するんです。やり方としては:
直したい行をコミットしちゃったコミットを、
git blame
で特定しておきます。見つけたコミットに対して、修正コミットを、
git commit --fixup COMMIT
,
git commit --squash COMMIT
というオプション付きで コミットします。
すると、対象のCOMMIT
のコミットメッセージを使って、
fixup! COMMIT のコミットメッセージ
squash! COMMIT のコミットメッセージ
というメッセージで コミットができます。その後、
git rebase -i --autosquash BASE_COMMIT
すると、
自動的に、COMMIT
の直後に 修正コミットを持ってきて、COMMIT
とくっつけようとします。
fixup / squash は、コミットメッセージ修正 なし / あり の違い。
(--autosquash
の並べ替えは、コミットメッセージ内容 で判定するので、
同一のコミットメッセージが rebase範囲に絡むと、誤爆しうる。
あと、手動でfixup!
squash!
を足したコミットメッセージ でコミットしても、効果は同じ。)首尾よく rebaseできれば、対象の
COMMIT
が、
間違えていた行を 正しく修正したコミットに生まれ変わります。なお、
git commit --fixup
,git commit --squash
を使いましたが;
git rebase -i
で 自分で指示するなら、
普通にコミットしたうえで、自分で並び替えてもいいです。
長文ありがたい・・・めっちゃ丁寧・・・これはしっかり理解せねば。
わかりやすかった具体例
ChatGPTに示してもらった具体例で完全に理解しました。
具体例を用いて、
git blame
,git commit --fixup/--squash
, およびgit rebase -i --autosquash
を使用したコミットの整理プロセスを説明します。この例では、example.rb
ファイルを修正し、過去のコミットに統合するプロセスを示します。初期のコミット履歴
最初に、プロジェクトのコミット履歴を見てみましょう。以下はシンプルな履歴の例です。
a1b2c3d [最新] Fix typo in README e4f5g6h Update example.rb with new feature i7j8k9l Initial commit
ステップ1:
git blame
で修正対象のコミットを特定
example.rb
の特定の行に問題があり、それがどのコミットで導入されたかを特定します。git blame example.rb
このコマンドの結果から、
e4f5g6h
コミットが修正対象であることを特定しました。ステップ2: 修正を加え、
git commit --fixup
で修正コミットを作成
example.rb
に修正を加え、ステージングした後、git commit --fixup e4f5g6h
を実行します。git add example.rb git commit --fixup e4f5g6h
これにより、次のようなコミットが追加されます:
a2b3c4d [最新] fixup! Update example.rb with new feature a1b2c3d Fix typo in README e4f5g6h Update example.rb with new feature i7j8k9l Initial commit
ステップ3:
git rebase -i --autosquash
でコミットを整理
i7j8k9l
コミットからリベースを開始します。git rebase -i --autosquash i7j8k9l
このコマンドはインタラクティブなリベースセッションを開始し、
fixup!
プレフィックスを持つコミットを自動的に元のコミットに統合するように指示します。実行後のコミット履歴
リベースが完了すると、コミット履歴は次のようになります。
a3b4c5d [最新] Fix typo in README e5f6g7h Update example.rb with new feature (and fixes) i7j8k9l Initial commit
e4f5g6h
コミットはe5f6g7h
になり、元の変更とfixup!
による修正が統合されました。コミットメッセージは元のコミットから引き継がれ、必要に応じて編集できます。このプロセスにより、プロジェクトの履歴がクリーンに保たれ、過去のコミットに対する修正が簡単に行えるようになります。
おわりに
改めてコメントありがとうございました。
git rebase
の使い道を知ってエンジニアとして1レベルアップした気分です。
あとはこれを実践して身体に覚えさせる・・・!