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に変換した後差分の検出を行ったため、差分がなく、リベース先の内容がそのまま採用されています。