概要
git 2.35で新しく merge.conflictStyle
にzdiff3
という設定が誕生したそうなので、どう変わったのかを見てみよう。
前提として意図的にコンフリクトするような環境は事前に作ってある
東京23区一覧を書いていくMarkdownを作った
まずはデフォルトのmerge
# 明示的に指定するならこうだが、デフォルトがこの挙動だ
❯ git config --global merge.conflictStyle merge
❯ git merge adachi-ku
Auto-merging tokyo-23ku.md
CONFLICT (content): Merge conflict in tokyo-23ku.md
Automatic merge failed; fix conflicts and then commit the result.
❯ git diff
diff --cc tokyo-23ku.md
index 34042c5,80b4120..0000000
--- a/tokyo-23ku.md
+++ b/tokyo-23ku.md
@@@ -1,4 -1,4 +1,8 @@@
* Chiyoda-ku
++<<<<<<< HEAD
+* Meguro-ku
++=======
+ * Adachi-ku
++>>>>>>> adachi-ku
* Shinjuku-ku
* Minatoku-ku
当たり前のように見慣れた結果だw
続いてdiff3
# まずは設定
❯ git config --global merge.conflictStyle diff3
❯ git merge adachi-ku
Auto-merging tokyo-23ku.md
CONFLICT (content): Merge conflict in tokyo-23ku.md
Automatic merge failed; fix conflicts and then commit the result.
❯ git diff
diff --cc tokyo-23ku.md
index 34042c5,80b4120..0000000
--- a/tokyo-23ku.md
+++ b/tokyo-23ku.md
@@@ -1,4 -1,4 +1,10 @@@
* Chiyoda-ku
++<<<<<<< HEAD
+* Meguro-ku
+* Shinjuku-ku
++||||||| 6ac52f7
++=======
+ * Adachi-ku
+ * Shinjuku-ku
++>>>>>>> adachi-ku
* Minatoku-ku
個人的には見慣れている merge
が圧倒的に見やすいwww
diff3
はパイプが入るのと、マージ元になる枝分かれ前のコミットID:6ac52f7
が出てくるのが特徴的だ
本日のメイン zdiff3
# まずは設定
❯ git config --global merge.conflictStyle zdiff3
❯ git merge adachi-ku
Auto-merging tokyo-23ku.md
CONFLICT (content): Merge conflict in tokyo-23ku.md
Automatic merge failed; fix conflicts and then commit the result.
❯ git diff
diff --cc tokyo-23ku.md
index 34042c5,80b4120..0000000
--- a/tokyo-23ku.md
+++ b/tokyo-23ku.md
@@@ -1,4 -1,4 +1,9 @@@
* Chiyoda-ku
++<<<<<<< HEAD
+* Meguro-ku
++||||||| 6ac52f7
++=======
+ * Adachi-ku
++>>>>>>> adachi-ku
* Shinjuku-ku
* Minatoku-ku
diff3
とzdiff3
の違いが分かるだろうか?
zdiff3
ではShinjuku-ku
の情報がコンフリクトしていない、というのが大きな特徴だ。
公式ドキュメントによる説明
マージ時に競合したハンクが作業ツリーファイルに書き出されるスタイルを指定します。デフォルトは "merge" で、<<<<<衝突マーカー、一方が行った変更、========マーカー、もう一方が行った変更、そして >>>>> マーカーが表示されます。別のスタイルである "diff3" は、====== マーカの前に |||| マーカと元のテキストを追加します。マージ」スタイルは、元のテキストを除外するため、また、行のサブセットが両側で一致した場合、それらがちょうど競合領域から引き出されるため、diff3よりも小さい競合領域を生成する傾向がある。別のスタイルである "zdiff3 "はdiff3に似ていますが、両側で一致する行が競合領域の最初か最後の近くに現れると、競合領域から削除されます。
なるほど、確かに今回の例だとShinjuku-ku
の情報だけがコンフリクトから外れたのも納得だ。
個人的にはmerge.conflictStyle zdiff3
は普段から設定として含んでしまっていいかなと思いました!
ではまた!