Существует ли стратегия слияния git или вариант стратегии для "взять оба"? - PullRequest
0 голосов
/ 26 февраля 2020

Полагаю, стратегия «осьминог» звучит примерно так, хотя я не понимаю сложностей.

То, что я действительно хотел бы сделать, это принимать конфликты слияния на уровне файлов и просто применять все изменения. Возможно, как следствие, я был бы в порядке, если бы их / наш порядок не был детерминирован c.

Это было бы изящно, хотя, вероятно, не является большой особенностью для многих людей. Например, что-то вроде:

git merge my-branch -X both или git merge -s naive?

Любопытно, если кто-нибудь использовал что-то подобное.

1 Ответ

0 голосов
/ 27 февраля 2020

Обычный термин для этого: union merge ; см. ссылку в комментарии grg . Не существует стратегии -s и опции -X eXtended-option для любой из существующих стратегий, чтобы сделать объединение файлов низкоуровневым слиянием. Однако вы можете создать файл .gitattributes и указать там merge=union, а у команды git merge-file есть опция --union, а также опции --ours и --theirs.

(Предположительно, никто не выдвинул -X union в качестве расширенного аргумента к существующей стратегии рекурсивного решения / разрешения, потому что так редко требуется это.)

Обсуждение стратегий слияния

* 1020 Стратегия * octopus очень особенная: она реализует относительно простое слияние, которое позволяет вам объединить более одного коммита с текущим (HEAD) коммитом. Требуется, чтобы это слияние имело никаких конфликтов в любом месте , поскольку в нем нет места для записи всех временных входов. Стратегии resol и recursive обрабатывают конфликты слияния путем копирования трех входных файлов - базы слияния, --ours и --theirs - в индекс в трех слотах индекса и затем используя существующий git merge-file код 1 для объединения этих трех файлов, записывая маркеры конфликта в окончательную выходную версию.

Обратите внимание, что стратегия -s resolve, реализованная git merge-resolve команда, такая же, как git merge-recursive (и реализуется тем же базовым кодом), с одним исключением: если git merge-recursive находит две или более фиксации базы слияния, git merge -s resolve просто выбирает один из них случайным образом, тогда как git merge-recursive сначала объединяет базы слияния для создания нового коммита, а затем использует новый коммит в качестве базы слияния.

Стратегия -s subtree является рекурсивной стратегией; по ходу дела он просто переименовывает файлы.

Оставшаяся стратегия (-s ours) даже не вычисляет базу слияния, поскольку фактически не выполняет слияние.

По сути, тогда На самом деле существует только две стратегии слияния : рекурсивная и осьминог. Остальные стратегии - это всего лишь модификации рекурсивных или вовсе не операций слияния (-s ours).

Вы можете написать свою собственную стратегию слияния. Просто напишите любую команду на любом исходном языке и назовите исполняемый двоичный файл git-merge-foo или git-merge-xyzzy или любой другой. Запуск git merge -s foo или git merge -s xyzzy теперь будет вызывать вашу стратегию с недокументированными аргументами, которые вы должны разгадать. Эти аргументы должны определять ваш выбор базы слияния и процесс слияния. Все оставлено на ваш собственный код, включая, как определить и реализовать слияние, и как git add получить файлы в индексе, и как запустить git commit (если вы собираетесь запустить его вообще). Чтобы сделать будущую запись фиксации фактическим слиянием, ваша команда должна оставить правильные файлы bread-crumb-trail в каталоге Git (git rev-parse --git-dir) на основе текущего рабочего дерева (начиная с Git 2.5).


1 Буквально не запускается git merge-file: вместо этого базовый код для выполнения слияний находится в различных исходных файлах, и оба git merge-file и git merge-recursive вызывают один и тот же Базовый код. Этот код принимает три входа и записывает один вывод. Для git merge-recursive три входа сохраняются в индексе; для git merge-file три хранятся в трех файлах файловой системы. Выходными данными во всех случаях является копия файла рабочего дерева. Если слияние завершается без конфликтов, git merge-recursive перемещает этот файл в нулевой интервал подготовки и продолжается без конфликтов, но git merge-file просто завершается с нулевым статусом. Если это объединение вызывает конфликты или не удается по другим причинам, git merge-recursive оставляет беспорядок в индексе и рабочем дереве и переходит к следующему файлу, как обычно, тогда как git merge-file просто завершается с ненулевым статусом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...