Должен ли diff3 быть конфликтующим по умолчанию на git?

Недавно я включил diff3, и теперь гораздо легче разрешить конфликт.

Раньше в некоторых случаях мне приходилось проверять журнал, чтобы узнать, почему люди сделали это и что делать слияние. Но с diff3 информация отображается всего в одном месте

<<<<<<< HEAD
THIS IS USEFUL
||||||| merged common ancestors
This is useful
=======
This is really useful
>>>>>>> c2392943.....

Отсюда легко видеть, что результат должен быть "ЭТО ДЕЙСТВИТЕЛЬНО ПОЛЕЗНО"

Интересно, есть ли недостатки для diff3? Почему это не поведение по умолчанию git?

Ответы

Ответ 1

Для других читателей (и из этой статьи):

В git есть возможность отображать конфликты слияния в формате diff3 (по умолчанию он отображает только два файла, которые должны быть объединены). Вы можете включить его так:

git config --global merge.conflictstyle diff3

На самом деле нет причин, по которым вы не должны включать стиль diff3, потому что вам часто требуется, чтобы предок определил, что такое правильное слияние.

Это было введено довольно рано (2008), и я полагаю, что это не по умолчанию, потому что стандартный unix diff не отображается как трехсторонний diff.


Как упоминалось в этой теме, если вы хотите выполнить эту команду без настройки конфигурации, чтобы можно было легко переключаться между обычными diff и diff3, это возможно в одном конкретном случае:

Если в индексе отмечен конфликт (то есть состояние, в котором вы находитесь после конфликтующего слияния, но перед тем, как пометить путь как разрешенный), вы можете сделать следующее:

git checkout --conflict=diff3 <path...>

Обратите внимание, что фактически выполняется проверка содержимого индекса в рабочем дереве, поэтому любые изменения, которые вы могли внести в конфликтующую копию рабочего дерева, будут перезаписаны.


Обратите внимание, что |||||| merged common ancestors будет развиваться с git 2.24 (Q4 2019)

Смотрите коммит b657047 (07 октября 2019 г.), коммит 8e4ec33 (01 октября 2019 г.) и коммит 4615a8c, коммит 45ef16f, коммит f3081da, коммит 5bf7e57, коммит e95e481, коммит a779fb8, коммит 8599ab4, коммит 7c0a6c8, commit c749ab1, commit bab5687, commit ff1bfa2, commit 4d7101e, commit 724dd76, коммит 345480d, коммит b4db8a2, коммит 98a1d3d, коммит 9822175, коммит 10f751c (17 августа 2019 г.) от Элайджа Ньюрен (newren).
(Merged by Junio C Hamano -- [TG45] -- in commit 280bd44, 15 Oct 2019)

merge-recursive: улучшенная метка для общего предка diff3

Signed-off-by: Elijah Newren

В commit 7ca56aa07619 ("merge-recursive: добавить метку для предка", 2010-03-20, Git v1.7.1-rc0 - merge), метку была добавлена строка "||||||", чтобы сделать ее более информативным заголовком "|||||| merged common ancestors" со следующим утверждением:

  Было бы лучше использовать более информативный ярлык.
  Возможно, кто-нибудь предоставит один день.

Эта выбранная метка была совершенно разумной, когда включилась рекурсивность, то есть, когда есть несколько базисов слияния.

(Я не могу придумать лучшего ярлыка в таких случаях.)

Но это на самом деле несколько вводит в заблуждение, когда есть уникальная база слияния или нет базы слияния.

Измените это в зависимости от количества баз слияния:

>=2: "merged common ancestors"
1:   <abbreviated commit hash>
0:   "<empty tree>"

Также были добавлены тесты, чтобы убедиться, что мы получаем правильное имя предка для каждого из трех случаев.