kledgeb Ubuntuの使い方や日本語化、アプリの使い方を紹介しています。

空のコミットオブジェクトもコミット対象にして、ブランチをリベースする

  空の「コミットオブジェクト」もコミット対象にして、ブランチをリベースします。

  空のコミットオブジェクトとは

    リベース実行時、変更内容(差分)がない「コミットオブジェクト」は、空のコミットオブジェクトとなります。

    この空のコミットオブジェクトは、リベース先でコミットが行われず、処理がスキップされます。

  空のコミットオブジェクトの例

    空のコミットオブジェクトの例です。

    例えば、以下の構成のリポジトリーがあるとします。
    「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」ブランチを指していることが分かります。


  6.ブランチの構成

    現在のブランチの構成を図にすると、以下のようになっています。



関連コンテンツ
同一カテゴリーの記事
コメント
オプション