空のコミットオブジェクトもコミット対象にして、ブランチをリベースする
空の「コミットオブジェクト」もコミット対象にして、ブランチをリベースします。空のコミットオブジェクトとは
リベース実行時、変更内容(差分)がない「コミットオブジェクト」は、空のコミットオブジェクトとなります。この空のコミットオブジェクトは、リベース先でコミットが行われず、処理がスキップされます。
空のコミットオブジェクトの例
空のコミットオブジェクトの例です。例えば、以下の構成のリポジトリーがあるとします。
「Commit2A」と「Commit2B」の変更内容は同じです。
「fix」ブランチを「master」ブランチにリベースすると、「Commit2B」は「Commit2A」と変更内容が同一であるため、「Commit2B」は空のコミットオブジェクトになります。
言い換えれば、差分がないということです。
リベースでは、このような空のコミットオブジェクトはスキップされます。
従って、リベース結果は以下のようになります。
「Commit4」の変更内容を元に「Commit4’」を生成してリベースが完了しています。
空のコミットオブジェクトをスキップせずリベースすることも可能
リベースでは、空のコミットオブジェクトをスキップせずリベースすることも可能です。コマンドの実行例
コマンドの実行例です。1.ブランチの確認
現在のブランチ構成を確認すると、以下のようになっています。現在のブランチは、「fix」ブランチであることが分かります。
同様に、「HEAD」は「fix」ブランチを指していることが分かります。
ここでは例として、「fix」ブランチを「master」ブランチにリベースし、「mastsr」ブランチに「fix」ブランチの変更内容を結合します。
2.ブランチの構成
現在のブランチの構成を図にすると、以下のようになっています。「Commit2A」と「Commit2B」の変更内容は同じです。
「fix」ブランチを「master」ブランチにリベースするため、リベース対象の「コミットオブジェクト」は、以下のようになります。
- Commit2B
- Commit4
3.コマンドの実行
コマンドのオプションは、以下のオプションを指定します。オプション |
---|
--keep-empty |
「端末」から、以下のコマンドを実行します。
コマンドの詳細は、「ファイルの変更内容を異なるブランチに結合するコマンドの説明」を参考にしてください。
ポイントは、赤字の箇所です。
git rebase --keep-empty master
4.空のコミットオブジェクトの検出
空のコミットオブジェクトが検出されると、以下のように空のコミットオブジェクトの情報が表示されます。ここで一時的にリベースが中断されます。
空のコミットオブジェクトの識別子には、「b355879」と表示されています。
この識別子は、「Commit2B」の識別子です。
リベース先に空のコミットオブジェクトを生成する場合、「5.」以降を参考にしてください。
リベース先に空のコミットオブジェクトを生成しない場合、「8.」以降を参考にしてください。
5.リベース先に空のコミットオブジェクトを生成する場合
リベース先に空のコミットオブジェクトを生成する場合、以下のコマンドを実行します。
git commit --allow-empty
空のコミットオブジェクトは、「Commit2B」をベースに生成されます。
6.コミットメッセージの入力
以下のようにテキストエディターが起動するので、「コミットメッセージ」を入力します。「#」で始まる行はコメント行なので、コミットメッセージには反映されません。
「コミットメッセージ」を入力したら、ファイルを上書き保存してテキストエディターを終了します。
7.コミット完了
以下のように、リベース先に空のコミットオブジェクトが生成されます。「9.」ヘ飛びます。
8.空のコミットオブジェクトを生成しない場合
リベース先に空のコミットオブジェクトを生成しない場合、以下のコマンドを実行します。
git reset
9.リベースの続行
以下のコマンドを実行し、リベースを続行します。
git cherry-pick --continue
10.リベース続行
残りのリベース対象に対してリベースが続行されます。11.ブランチの確認
現在のブランチ構成を確認すると、以下のようになっています。「HEAD」が「分離したHEAD」になっています。
この「HEAD」は、リベース後の「コミットオブジェクト」を指しています。
12.ブランチの構成
現在のブランチの構成を図にすると、以下のようになっています。空のコミットオブジェクトを生成したため、「Commit2B」の変更内容を元に、「Commit2B’」が新規に生成されています。
同様に「Commit4」の変更内容を元に、「Commit4’」が新規に生成されています。
以上でリベースは完了です。
masterブランチのブランチヘッドをHEADに合わせるには
現在の「HEAD」は「分離したHEAD」であるため、このまま利用するには都合が悪いです。ここでは例として、「master」ブランチの「ブランチヘッド」が指す「コミットオブジェクト」を、「HEAD」が指す「コミットオブジェクト」を指すように変更します。
1.ブランチヘッドの移動
以下のコマンドを実行し、「master」ブランチの「ブランチヘッド」を「HEAD」が指す「コミットオブジェクト」を指すように変更します。
git branch --force master HEAD
2.ブランチの確認
現在のブランチ構成を確認すると、以下のようになっています。「HEAD」は「分離したHEAD」になっています。
「master」ブランチの「ブランチヘッド」は、「HEAD」が指す「コミットオブジェクト」を指しています。
3.ブランチの構成
現在のブランチの構成を図にすると、以下のようになっています。4.masterブランチのチェックアウト
以下のコマンドを実行し、「master」ブランチをチェックアウトします。
git checkout master
5.ブランチの確認
現在のブランチ構成を確認すると、以下のようになっています。現在のブランチは、「master」ブランチであることが分かります。
同様に、「HEAD」は「master」ブランチを指していることが分かります。