Ответ 1
Обновленный ответ: Моя первоначальная версия script ниже была ошибочной в том смысле, что $conflicting_files
фактически не содержал только файлы, которые действительно имели конфликты, но все файлы, которые были изменены в обеих родительских ветвях (но не обязательно имели конфликты). Кроме того, он не использовал "настроенный инструмент слияния", как рекламируется в обосновании, но diffuse
. Я рассмотрел обе проблемы в текущей версии script.
Оригинальный ответ: Скажем, у нас есть "ведущая" ветвь с основным развитием, и ветка "тема", которая добавляет некоторую функцию поверх некоторого (более старого) состояния мастера. Говоря, что вы ищете только файлы, измененные при компиляции слиянием, я предполагаю, что вас интересуют только те изменения "тема", которые были введены в "master" при компиляции слияния (включая любое разрешение конфликта), а не в не- противоречивые изменения, которые были сделаны в "хозяине", поскольку "тема" была разветвленной. Предполагая, что "master" является первым родителем вашего объединения, а "тема" - вторым, это может быть достигнуто с помощью
git difftool <merge commit>^1 <merge commit>
Обратите внимание, что нет смысла использовать трехсторонний diff здесь, поскольку мы смотрим на состояние, в котором включает любое разрешение конфликта. Это также то, что GitHub показывает для слияния, кстати, см., Например, это комминирование слияния, которое я использовал для тестирования.
Чтобы увидеть только конфликтующие файлы и их разрешения в трехстороннем инструменте diff, я придумал этот script
#!/bin/sh
if [ $# -ne 1 ]; then
echo "Rationale : Show the conflict resolution of a given merge commit in the configured merge tool."
echo "Usage : $(basename $0) <merge commit>"
exit -1
fi
# Test e.g. with https://github.com/git/git/commit/8cde60210dd01f23d89d9eb8b6f08fb9ef3a11b8
our=$1^1
their=$1^2
base=$(git merge-base $our $their)
conflicting_files=$(git merge-tree $base $our $their | grep -A 3 "changed in both" | grep "base" | grep -Po "[^\s]+$")
for f in $conflicting_files; do
diffuse -r $our -r $base -r $their $f
done
Я использую Diffuse вместо Beyond Compare, поскольку первый может работать непосредственно на Git, а не локальные файлы; измените порядок аргументов по своему вкусу. Чтобы использовать BC, вам, вероятно, потребуется сделать временные проверки; Я также думал о повторном слиянии, применении известного разрешения и запуске конфигурации git mergetool
, но обе эти идеи потребуют больше работы, чтобы не загромождать ваше рабочее дерево и не выполнять очистку должным образом.