Git – rebase -i~コミットの統合

概要

git rebaseは今いるブランチのベースを変更するが、-i (intaractive)オプションを付けることで、複数コミットを統合することができる。

interactiveという通り、その過程で何度かエディターが起動して操作内容が表示され、コミット統合に必要な内容に書き換えていく。

準備

以下のように、sample.txtに1行ずつ追加するコミットを含むリポジトリーを準備する。

2つのコミットの統合

rebaseコマンド

main-2main-3のコミットを統合するため、その直前=main-1のコミット直後を指定してrebaseする。このとき-iオプションを付けることで、リベースの過程での操作を指定できる。

各コミットへの対応記述

rebaseを実行するとエディターが起動して以下のように表示される。

  • この段階では、ベースとなるmain-1より後のmain-2main-3の2つのコミットについて、そのまま適用されることになる
  • つまり、main-1コミットの後にmain-2main-3がそのまま連なることになり、何も変わらない
  • これを、main-2main-3をまとめた上でmain-1の後に来るようにしたい

Commands:のところを見ると、以下のように読める。

  • p, pickはそのコミットをそのまま使う
  • s, squashはそのコミットを使うが、1つ前のコミットに統合(融合?)させる

そこで、後の方のコミットmain-3pickからsquashに変更する。こうすれば、main-2コミットはそのまま使われ、そこにmain-3コミットも統合されるはず。

コミットメッセージの編集

上記の内容で保存・終了すると、さらにエディターが起動して以下のように表示される。

2つのコミットを1つにするので、コミットメッセージを1つだけにして、終了の空行を入れる。

処理結果

上記の内容を保存・終了すると、rebaseの処理内容が以下のように表示される。

ログで確認すると、main-2main-3が1つにまとめられ、指定したコミットメッセージになっている。

コミットをまとめただけなので、sample.txtの内容は変化しない。

3つ以上のコミットの統合

main-13の3つの連続するコミットをまとめるため、その直前のコミットを指定してrebase。

エディターが起動。

以下のようにpicksquashに変更して保存。これにより、main-2main-1に統合され、そこにmain-3も統合される。

再度エディターが起動。

統合後のコミットメッセージを編集して保存・終了。

実行結果。

3つのコミットが1つにまとめられた。

イニシャルコミットとの統合

一番最初のコミットと統合するには、以下のコマンドを使う。

git rabase -i --root

以下の例では、README.mdを修正した2つ目のコミットを1つ目のInitial commitに統合している。

リモートへの反映

リモートからpullしたリポジトリーの場合、そのままではpushできない。

ローカルでのrebaseの結果をリモートにそのまま反映するには、push -fで強制的に上書きする。

ただし他のローカルでその内容を反映させるには、改めてcloneする必要がある。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です