Как обнаружить конфликт между двумя 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 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чтобы увидеть, если это противоречит.

Другие вопросы по тегам