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

Recursiveマージストラテジーで、gitattributesで定義した属性を適用してから、リベースする

  「Recursiveマージストラテジー」では、リベース先の「gitattributes」で定義した属性を適用してから、「リベース」を行うことができます。

  属性の適用対象は、リベース対象の「コミットオブジェクト」にあるファイルが対象になります。

    リベース対象の「コミットオブジェクト」にあるファイルの改行コードを揃えたい時など、フィルターを実行してからリベースしたい時に利用します。

gitattributesを適用せずマージした場合

  まずは比較のため、「Recursive」マージストラテジーを利用した「リベース」結果を見てみます。

  「gitattributes」で定義した属性は、適用されません。

  1.ブランチの確認

    現在のブランチ構成を確認すると、以下のようになっています。
    現在のブランチは、「fix」ブランチであることが分かります。
    同様に、「HEAD」は「fix」ブランチを指していることが分かります。


  2.ブランチの構成

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


    「fix」ブランチを「master」ブランチにリベースするため、リベース対象の「コミットオブジェクト」は、以下のようになります。

  • Commit4
  • Commit5 

  3.masterブランチのcommon.txtファイルの中身

    「master」ブランチの「common.txt」ファイルの中身は、以下のようになっています。


    「common.txt」の改行コードを調べると、「LF」であることが分かります。
    「LF」は、UbuntuやOS Xのデフォルトの改行コードです


  4.fixブランチのcommon.txtの中身

    「fix」ブランチの「common.txt」の中身は、以下のようになっています。


    一見「master」ブランチの「common.txt」の中身と同じように見えます。
    実際文字列の構成は同じです。

    しかし「common.txt」の改行コードを調べると、「CR + LF」であることが分かります。
    「CR + LF」は、Windowsのデフォルトの改行コードです。


  5.masterのgitattributes

    「master」ブランチの「.gitattributes」ファイルの中身は、以下のようになっています。

*.txt eol=lf


    ファイルの拡張子が「.txt」のファイルの改行コードを、LFに変換するという意味です。

  6.リベースの実行

    「端末」から以下のコマンドを実行し、リベースを行います。
   
git rebase --verbose --merge --strategy=recursive master


  7.マージコンフリクトの発生

    以下のように、「master.txt」ファイルで「マージコンフリクト」が発生します。


  8.master.txtファイルの中身

    「マージコンフリクト」が発生した「master.txt」ファイルの中身を見てみると、差分が衝突した箇所に「コンフリクトマーカー」が挿入されています。


    文字列は同じですが改行コードが異なるため、差分として検出されています。

gitattributesで定義した属性を適用してから、リベースする

  上記の例を利用して、「gitattributes」で定義した属性を適用してから、リベースしてみます。

  「1.」から「5.」までは、上記と同じです。

  6.コマンドの実行

    コマンドのオプションは、以下のオプションを指定します。

ショートオプション ロングオプション オプションの値
-s --strategy= recursive
-X --strategy-option= renormalize

    「端末」から、以下のコマンドを実行します。
    コマンドの詳細は、「ファイルの変更内容を異なるブランチに結合するコマンドの説明」を参考にしてください。

    ポイントは、赤字の箇所です。

git rebase --verbose --merge --strategy=recursive --strategy-option=renormalize master


  7.コマンドの実行

    以下のように、リベース結果が表示されます。


  8.ブランチの確認

    現在のブランチ構成を確認すると、以下のようになっています。
    「fix」ブランチが指す「コミットオブジェクト」の識別子が、「1.」と異なっています。


  9.ブランチの構成

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


    「Commit4」の変更内容を元に、「Commit4’」が新規に生成されています。
    「Commit5」は差分がなかったため、空のコミットオブジェクトになり、リベース先でコミットされていません。

    「Commit4」と「Commit5」は、いずれも削除されています。

  10.master.txtファイルの中身

     リベース後の「master.txt」ファイルの中身を見てみます。


    改行コードをLFに変換した後差分の検出を行ったため、差分がなく、リベース先の内容がそのまま採用されています。


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