本文へ移動
vast-cowのブログ
前のページへ戻る

Git Rebaseで過去のコミットをSquashする方法

この記事を編集

Gitのrebaseコマンドを使ってコミットをSquash(統合)すると、コミット履歴を整理したいときに便利です。以下に手順を説明します。


1. Squashするコミットを確認する

まず、コミットログを確認して、どのコミットをまとめるか決めます。

git log --oneline

例:

a1b2c3d タイポを修正
d4e5f6g 機能Xを追加
h7i8j9k WIP: 機能Xを実装
...

ここでは、機能Xを追加とWIP: 機能Xを実装をSquashするとします。


2. Interactive Rebaseを開始する

Squashしたいコミットの直前のコミットをベースとして、git rebase -iを実行します。

git rebase -i <base_commit_id>

この例で、a1b2c3dがその直前のコミットである場合は、次のように実行します。

git rebase -i a1b2c3d

3. コミット一覧を編集する

エディタが開き、次のような内容が表示されます。

pick d4e5f6g 機能Xを追加
pick h7i8j9k WIP: 機能Xを実装

2つ目のpickをsquash(または単にs)に変更します。

pick d4e5f6g 機能Xを追加
squash h7i8j9k WIP: 機能Xを実装

4. コミットメッセージを編集する

次に、Gitからコミットメッセージを統合するよう求められます。

# これは2個のコミットを組み合わせたものです。
# 1つ目のコミットメッセージ:
機能Xを追加

# 以下のコミットメッセージも含まれます:
WIP: 機能Xを実装

最終的なメッセージが簡潔になるよう整理します。

機能Xを追加

5. Rebaseを完了する

保存してエディタを閉じます。GitがRebaseを適用し、コミットを1つにSquashします。


6. トラブルシューティング


7. ルートコミットを含めてSquashする(--root)

デフォルトでは、git rebase -i <base>は指定したベースコミットの次のコミットからRebaseを行います。最初のコミット(ルートコミット)もInteractive Rebaseの対象に含めたい場合(たとえば、初回コミットを編集したり、後続のコミットとSquashしたりする場合)は、--rootオプションを使用します。

git rebase -i --root

このコマンドの動作

一般的な用途と例

  1. すべてのコミットを1つの初回コミットにSquashする 履歴全体を含む1つのコミットにしたい場合は、ルートコミットをpickのままにして、それ以外のすべてのコミットをsquash(またはs)に変更します。

    pick a1b2c3d 初回コミット
    squash d4e5f6g 機能Xを追加
    squash h7i8j9k WIP: 機能Xを実装
    ...

    保存すると、Gitが統合後のコミットメッセージを編集するためのエディタを開くので、最終的なメッセージを作成できます。

  2. ルートコミットのメッセージを編集・変更する Rebase中に初回コミットのメッセージを変更するには、最初の行をreword(またはr)に変更します。

    reword a1b2c3d 初回コミット
    pick d4e5f6g 機能Xを追加
    ...

    Rebaseが一時停止し、ルートコミットのメッセージを編集するよう求められます。

  3. ルートコミットの内容を修正する ルートコミットの実際のツリー(ファイルの追加・削除)を変更する必要がある場合は、ルートのエントリにeditを指定します。Rebaseはそのコミットで一時停止します。その後、ファイルを変更してgit addし、git commit --amendを実行してからRebaseを続行できます。

    # Interactive Rebaseのtodo:
    edit a1b2c3d 初回コミット
    pick d4e5f6g 機能Xを追加
    ...
    # Rebaseが停止したら:
    # ワーキングツリーに変更を加える
    git add <files>
    git commit --amend --no-edit   # 必要に応じてメッセージも編集
    git rebase --continue

注意点


まとめ


この記事を編集
この記事を共有:

コメント


前の記事
リモートマシンのGNOME KeyringをX11 ForwardingでUnlockする
次の記事
Bashの履歴ファイルを安全に手動編集する方法