Gitのコミット履歴を整理する(rebase と squash)
今回は、Gitのコミット履歴を綺麗に整理するためのテクニックである rebase と squash について解説していきたいと思います。
開発に集中していると、つい「不要なコメントを削除」や「typo修正」といった細かいコミットを積み重ねてしまい、後から履歴を見返したときに分かりにくくなってしまうことはないでしょうか。
feat: 機能Aを追加
fix: 軽微なバグ修正
refactor: コードのリファクタリング
fix: 再度の修正
docs: ドキュメントの typo 修正
このようなコミット履歴は、変更の意図が分散してしまい、後々のレビューやデバッグの際に追跡が困難になる可能性があります。
この記事では、そういった細かすぎるコミットを整理し、分かりやすい履歴を作成する方法を2つご紹介します。
なぜコミット履歴を整理する必要があるのか
コミット履歴を整理することには、いくつかの重要なメリットがあります。
- レビューの効率化: 変更内容が一つのコミットにまとまっていることで、レビュワーは変更の全体像を把握しやすくなります。
- 変更履歴の追跡性向上: 将来、特定の機能がいつ、どのような変更で追加されたのかを調査する際に、関連する変更が一つにまとまっていると非常に追いやすくなります。
- プロジェクト品質の向上: 整理されたコミット履歴は、プロジェクトそのものの品質と管理レベルの高さを示すことにも繋がります。
方法1: 現在のブランチのコミットを整理する (git rebase -i)
「現在のブランチで、少し細かくコミットしすぎてしまったな」という場合に有効なのが git rebase -i
(インタラクティブ・リベース) です。このコマンドを使うと、指定した範囲のコミットを対話形式で編集できます。
チュートリアル:最新3つのコミットを1つにまとめる
ここでは例として、最新の3つのコミットを1つに統合する手順を解説します。
1. インタラクティブリベースの開始
まず、HEAD~3
を指定して、最新から3つのコミットを対象にリベースを開始します。
git rebase -i HEAD~3
2. エディタでの編集
このコマンドを実行すると、Vimなどのデフォルトエディタが起動し、以下のようなコミット一覧が表示されます。
pick 1a2b3c4 fix: ちょっとした修正
pick 5d6e7f8 feat: 機能Aの追加
pick 9g8h7i6 docs: 説明を追記
※コミットの順番は古いものが上になります。
今回は feat: 機能Aの追加
というコミットに他の2つをまとめたいとします。残したいコミットの pick
はそのままに、まとめたいコミットの行頭を s
(squash) または f
(fixup) に変更します。
pick 5d6e7f8 feat: 機能Aの追加
s 1a2b3c4 fix: ちょっとした修正
s 9g8h7i6 docs: 説明を追記
- squash: 前のコミットに統合し、コミットメッセージも後で編集するために残します。
- fixup: squash と同様に統合しますが、こちらのコミットメッセージは破棄されます。
3. コミットメッセージの編集
ファイルを保存してエディタを閉じると、次に統合後のコミットメッセージを編集する画面が開きます。ここで、まとめられたコミットの新しいメッセージを記述して保存します。
# This is a combination of 3 commits.
# This is the 1st commit message:
feat: 機能Aの追加
# This is the 2nd commit message:
fix: ちょっとした修正
# This is the 3rd commit message:
docs: 説明を追記
不要な行を削除・修正し、分かりやすいメッセージに編集して保存すれば完了です。これで3つのコミットが1つに統合されました。
方法2:マージ時にコミットをまとめる (git merge --squash)
「開発ブランチ(featureブランチ)のコミットを、mainブランチにマージする前にきれいにしたい」というシナリオで役立つのが git merge --squash
です。
このコマンドは、対象ブランチのすべてのコミットを、マージ先のブランチで一つのコミットとしてまとめることができます。
チュートリアル:feature-branch のコミットを main に1つでマージする
1. mainブランチへの移動
まず、取り込み先である main
ブランチにチェックアウトします。
git checkout main
2. --squash オプション付きでマージ
次に、--squash
オプションを付けて feature-branch
をマージします。
git merge --squash feature-branch
このコマンドを実行すると、feature-branch
で行われたすべての変更が、コミットされずにステージングエリアに追加された状態になります。
3. コミットの実行
最後に、git commit
コマンドで分かりやすいメッセージを付けてコミットします。
git commit -m "feat: ユーザー認証機能の追加"
これにより、feature-branch
での細かな作業履歴はブランチ内に残しつつ、main
ブランチには「ユーザー認証機能の追加」という一つのまとまったコミットだけが記録されます。
rebase を使用する際の注意点
git rebase
はコミット履歴を書き換える非常に強力なコマンドです。そのため、複数人で共有しているリモートブランチ(例: origin/main)に対して rebase を実行してはいけません。履歴の不整合を引き起こし、他の開発者との間で深刻なコンフリクトが発生する原因となります。
基本的には、まだプッシュしていない、自分のローカル環境上のコミットに対して使用するようにしましょう。
まとめ
今回はGitのコミット履歴を整理する git rebase -i
と git merge --squash
について解説しました。
綺麗なコミット履歴を保つことは、自分自身を含むチーム全体の開発効率を向上させるための重要な習慣だと思います。
ぜひ、日々の開発に取り入れてみてください。
以上です。