Проверить конфликты для merge'а без смены ветки

Представим, что я сейчас нахожусь на коммите 1111111111.

Не меняя локальных файлов я хочу проверить, возникнут ли конфликты при мёрдже коммитов 2222222222 и 3333333333. Как я могу это сделать?


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

Автор решения: Qwertiy

Более-менее получилось (спасибо @AlexeyTen за подсказку), но смущает тот факт, что приходится парсить патч (впрочем, он парсится верно, поскольку во всех строках кроме искомых вторым символом идёт пробел - спасибо @KoVadim). Есть проблемы со слишком длинными строками, но вряд ли мы ищем строки длиннее 8192 символов.

@echo off

set ancestor=no-such-branch
for /f "delims=" %%x in ('git merge-base %1 %2') do set ancestor=%%x

if %ancestor%==no-such-branch (echo Failed to find ancestor & exit /b 1)

git merge-tree %ancestor% %1 %2 | findstr /b "+<<<<<<< -<<<<<<<" >nul && echo Conflicts found || echo No conflicts

Использование:

>check-conflicts.bat 2222222222222222222222222222222222222222 3333333333333333333333333333333333333333
No conflicts

>check-conflicts.bat 2222222222222222222222222222222222222222 000
fatal: Not a valid object name 000
Failed to find ancestor

>check-conflicts.bat 2222222222222222222222222222222222222222 4444444444444444444444444444444444444444
Conslicts found

>check-conflicts.bat master develop
FINDSTR: Слишком длинная строка 95913.
No conflicts
→ Ссылка
Автор решения: aleksandr barakin

при наличии posix-совместимой оболочки и программы grep:

#!/bin/sh

b=$(git merge-base $1 $2)

if [ -z "$b" ]; then echo "не удалось найти общего предка для $1 и $2"; exit; fi

if git merge-tree "$b" $1 $2 | grep -q '^+<<<<<<<'; then
  echo "есть конфликты"
else
  echo "нет конфликтов"
fi

использование:

$ этот-скрипт хэш-или-метка-1 хэш-или-метка-2

доп. чтение: man git-merge-base man git-merge-tree

→ Ссылка