Цель состоит в том, чтобы при конфликте файлов
1) иметь возможность пометить файл как "находящийся в конфликте", а
2) иметь возможность использовать Beyond Compare междунеотправленные версии файла («наша» версия и «их» версия).
Я предупреждаю, что, хотя в простых случаях это будет хорошо работать, это несколько отрицательно сказывается на подходе трехстороннего слияния, который обычно используется (т.е. вы не смотрите на изменения в контексте слияниябаза), поэтому в некоторых более сложных случаях это будет не так просто.(По этой причине я бы рекомендовал ознакомиться с более «стандартным» подходом к разрешению конфликтов, чтобы вы могли, по крайней мере, прибегнуть к нему при необходимости.)
Но, безусловно, есть несколько способов сделать это,Самое простое - начать слияние как обычно
git checkout our_branch
git merge their_branch
, а затем, если оно конфликтует, вернуть рабочее дерево к «нашей» версии
git checkout --ours path/to/conflicted/file
Если Beyond Compare настроен наработать как инструмент сравнения, тогда вы можете пропустить оформление заказа и просто
git diff our_branch their_branch -- path/to/conflicted/file
, но недостатком здесь является то, что у BC не будет открытой рабочей версии файла, поэтому у вас может не бытьподдержка, которую вы хотите для непосредственного редактирования.
Итак, еще один вариант, более сложный в настройке, но более автоматический в использовании, - это установка собственного драйвера слияния.Пользовательский драйвер слияния включается всякий раз, когда изменяются и «наша» версия, и «их» версия данного файла (относительно «базовой» версии).Это скрипт, который получает в качестве параметров имена временных файлов, представляющих различные версии файла.Он создает (предварительный) результат слияния по пути для «нашей» версии и возвращает состояние, указывающее, возникли ли конфликты.
Драйверы слияния описаны в документации к атрибуту merge
(на * 1023).*https://git -scm.com / документы / gitattributes ).Это также показывает, что при наличии настроенного драйвера слияния вы бы связали его с файлом (-ами) по заданному пути (-ям) с файлом .gitattributes
.(Вы можете связать его со всеми путями в вашем репо с записью для *
, но если ваше репо может содержать двоичные файлы, вы можете либо избежать этого, либо позаботиться о том, чтобы ваш скрипт драйвера вел себя разумно и для двоичных файлов..)
Сам сценарий попытается выполнить обычное объединение
git merge-file -p <ours> <base> <theirs> > <temp-path>
(где <ours>
, <base>
и <theirs>
- из параметров сценариев, а <temp-path>
это новый временный файл).Если эта команда возвращает 0 (без конфликтов), сценарий переместит вывод (<temp-path>
) поверх «нашей» версии и вернет 0. В противном случае он удалит временный файл, оставит «наш» без изменений и вернет ненулевое значениеvalue.
Теперь это сработало бы так же, как и при первом подходе, за исключением того, что вы можете пропустить git checkout --ours
.Это может не стоить того.Но преимущество этого решения в том, что вы можете использовать его, чтобы сделать немного больше.
Проблема со всеми вышеперечисленными решениями состоит в том, что если файл содержит любые конфликты, то ни одиниз изменений (включая не конфликтующие изменения) для этого файла автоматически объединяются.Вы должны обработать весь файл вручную (с помощью Beyond Compare или любого другого).
Вы можете уточнить скрипт драйвера слияния, чтобы в случае конфликта он перезапускал слияние с параметром стратегии --ours
git merge-file --ours <ours> <base> <theirs>
(Вы все равно хотите сначала запустить без опции --ours
, чтобы вы знали, возникли ли какие-либо конфликты. Если есть , есть конфликты, то вы удаляете временный файл,перезапустите с опцией --ours
- но без -p
или перенаправления вывода - и, опять же, верните ненулевое значение, чтобы git знал, что был конфликт.)
Наконец, обратите внимание, что это должно не следует путать с тем, что произойдет, если вы просто запустите слияние либо с -s ours
(который полностью игнорирует другое содержимое ветви), либо с -X ours
(который разрешает конфликты в пользу "нашей" версии ине сообщает о конфликтах ).