Как обнаружить конфликт между двумя git-репозиториями.
Для реализации github-подобной функции запроса fork/pull в моем проекте, функция автоматического слияния должна обнаруживать конфликт между репозиторием источника / цели каждый раз при просмотре запроса pull.
Одно из решений, которое приходит ко мне, - проанализировать вывод 'git request-pull'. Есть ли более простой способ обнаружить конфликт?
5 ответов
Наконец я написал свою собственную функцию для обнаружения конфликта.
Это довольно просто, просто извлеките все линии различий и сравните, если есть такие же модификации.
Я удалил свой предыдущий ответ, я не понял вопроса...
Теперь вот новый блестящий ответ:
git merge --ff-only <branch>
Если нет конфликтов, будет выполнено слияние. С конфликтом, это дает вам сообщение: Not possible to fast-forward
, Код возврата консоли (echo $?) Равен 128 в этой ситуации.
Мы создали git-конфликт-детектор, который проверяет последний выданный коммит против всех существующих веток.
Это простой сценарий, который инициируется URL-адресом GitHub WebHook и даже знает, как отправить уведомление HiChat при обнаружении конфликта.
Мы основали наше решение на анализе git merge --ff-only <branch>
вывод, как вы можете увидеть здесь
У нас есть открытый исходный код, чтобы все могли наслаждаться, учиться и вносить свой вклад.
Насколько я знаю, вы не можете узнать, вызовет ли слияние конфликты, пока вы на самом деле не объедините эти ветви.
Это уже указывалось в: Как проверить слияние без фактического слияния.
Итак, чтобы ответить на ваш вопрос, если вам нужно реализовать такую функцию, вам, скорее всего, следует попытаться объединить ваш источник / цель и откатить действие объединения (используя git reset --hard
).
Я никогда не пользовалась git request-pull
Но, глядя на вывод, я не вижу никакой информации, которая могла бы помочь вам решить вашу проблему. Вы могли бы получить тот же результат, используя git diff
, git wtf
, git remote show <name>
,
Рекомендации:
git wtf
: https://github.com/michaelklishin/git-wtfgit request-pull
: http://progit.org/book/ch5-2.html
Для справки, естьgit merge-tree
это может сказать вам в cmdline, если два коммита, то есть. ветки то есть. Конфликт запросов на включение без затрагивания индекса или рабочего дерева:
$> git merge-tree 9e451918b3bb56f857c6f6df5d527092c02b2b3a b246935
60633013298d0dc97cde3738a378228b24e2b065
100644 88c2893ef8df18fd38034deab08cfee24dfb26fe 2 file1
100644 257cc5642cb1a054f08cc83f2d943e56fd3ebe99 3 file1
Auto-merging file1
CONFLICT (add/add): Merge conflict in file1
Конечно, вам нужно принести оба.
API Github, похоже, не слишком отвечает на этот вопрос. PR может определить, есть ли у него конфликты слияния с базовой веткой. Также можно сравнить два коммита , но это говорит только о различиях или патчах, но не о наличии конфликта. Кажется, не существует API, позволяющего оценить, будут ли конфликтовать два извлечения, ветки или фиксации, хотя Github определенно имеет всю необходимую информацию в своей базе данных. Я не пробовал, но предполагаю, что когда вы получите информацию о патче с github, вы сможете запуститьpatch --dry-run
чтобы увидеть, если это противоречит.