0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

How to git rebase

Posted at

Gitのコミット履歴を整理する(rebase と squash)

今回は、Gitのコミット履歴を綺麗に整理するためのテクニックである rebasesquash について解説していきたいと思います。

開発に集中していると、つい「不要なコメントを削除」や「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 -igit merge --squash について解説しました。

綺麗なコミット履歴を保つことは、自分自身を含むチーム全体の開発効率を向上させるための重要な習慣だと思います。

ぜひ、日々の開発に取り入れてみてください。

以上です。

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?