Проверить конфликты для 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