Как поменять поведение git merge при обнаружении не разрешающихся конфликтов

Есть ли какой-нибудь способ сделать так, чтобы git при обнаружении конфликтов при merge, которые он автоматически не смог разрешить, не делал бы файл со стандартными вставками по типу:

<<< HEAD 
... 
=== 
... 
>>> branch

А вместо этого создавал бы переименованную копию файла с другой ветки, а изначальный файл не трогал. Мне это надо для разрешения конфликтов с помощью стороннего инструмента, который как раз таки требует 2 сравниваемых файла, а те вставки от гита не принимает.


Ответы (1 шт):

Автор решения: Total Pusher

Если git поддерживает вашу программу

Есть готовый инструмент mergetool через который можно запустить программу для слияния.

Выполните git mergetool --tool-help, она покажет список поддерживаемых программ. У меня он такой:

araxis, kdiff3, vimdiff, vimdiff2, vimdiff3, bc, bc3, codecompare, deltawalker, diffmerge, diffuse, ecmerge, emerge, examdiff, guiffy, gvimdiff, gvimdiff2, gvimdiff3, meld, opendiff, p4merge, tkdiff, tortoisemerge, winmerge, xxdiff

Если в этом списке ваша программа есть, установите ее как программу по-умолчанию, например kdiff3:

git config --global merge.tool kdiff3
# если гит не находит программу, пропишите ее путь в окружении $PATH или явно укажите так:
git config --global mergetool.kdiff3.path "/path/to/kdiff3"

Затем выполните слияние git merge (ваша проблемная ветка) и запустите программу: git mergetool

Оригинал и новый файл по отдельности

Напишем такой баш скрипт, я его сохранил в домашнем каталоге /home/pusher/bin/diff.sh:

#!/bin/bash

BASE="$1"
LOCAL="$2"
REMOTE="$3"
MERGED="$4"

cp "$LOCAL" "$MERGED"
cp "$REMOTE" "$MERGED.new"

Он будет "возвращать назад" оригинальный файл и копировать новый в .new.

Затем, находясь в каталоге с проектом, настройте его:

git config merge.tool copynew
git config mergetool.copynew.cmd '/home/pusher/bin/diff.sh $BASE $LOCAL $REMOTE $MERGED'
git config mergetool.keepBackup false

Можно использовать опцию --global, тогда эти настройки будут глобальными.

  • назначен новый инструмент слияния copynew
  • прописан путь до него
  • файлы .orig не будут сохраняться (чтобы не засорять каталог)

После этого:

  • сливаем git merge (ваша проблемная ветка) - будет сообщено о конфликтах и файлы будут с теми самыми <<< HEAD ...
  • запускаем mergetool: echo y | git mergetool -y -t copynew

На этом все. Файлы с конфликтами будут возвращены в оригинальное состояние, а также создадутся .new файлы, которые по вашему замыслу нужно передать вашему стороннему инструменту.

→ Ссылка