Разрешать конфликты в пользу наших / их неконфликтных изменений - PullRequest
1 голос
/ 12 февраля 2020

git checkout --theirs . например, просто берет весь "их" файл.

Я ищу способ использовать "наши" или "их", но только для конфликтов, как будто всегда удаляя соответствующие другая часть и маркеры конфликта.

1 Ответ

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

Вы можете, за до запустить операцию git merge, выбрать именно это, используя опции -X. Эти параметры 1 позволяют вам выбирать «наше» или «свое» переопределение во время конфликтов низкого уровня (внутри файла), не влияя на объединение не конфликтующих изменений с обеих сторон.

Если вы уже начали слияние и разрешили некоторые конфликты, прерывание слияния и перезапуск с помощью -X ours или -X theirs является болезненным. Это также не нужно, поскольку Git предоставляет отдельную команду git merge-file, которая выполняет трехстороннее объединение для одного набора из трех входных файлов.

Следовательно, предположим, что вы начали объединение, и у него было три конфликта и он прекратился. Если в этот момент вы запустите git status, вы увидите, что эти три файла не объединены. Итак, вы вручную слили один из трех файлов, начали со второго и затем подумали: Подождите, я бы хотел, чтобы Git сделал это для меня.

Что на этом этапе вы можете остановить ручное разрешение файла рабочего дерева. Выйдите из любого редактора, в котором вы находитесь, обратно в командную строку. Для второго из трех файлов извлеките все три входа:

git show :1:file.ext > file.BASE
git show :2:file.ext > file.OURS
git show :3:file.ext > file.THEIRS

Теперь у вас есть три входа, которые Git попытались и не смогли объединить самостоятельно. Git попытка слияния трех находится в file.ext; три входа находятся в этих трех файлах с именами .BASE, .OURS и .THEIRS.

Теперь вы можете вызывать git merge-file и передавать его --ours или --theirs, чтобы выбрать наш или их изменения, где есть конфликты:

git merge-file --ours file.OURS file.BASE file.THEIRS

Полученное слияние записывается обратно в file.OURS. Проверьте его и посмотрите, понравится ли вам результат; если это так, переименуйте его в file.ext и git add file.ext, чтобы пометить этот файл как разрешенный. Удалите копии file.BASE и file.THEIRS, которые загромождают ваше рабочее дерево.

У вас есть один оставшийся неразрешенным файл. Повторите три команды извлечения и команду git merge-file для этих трех копий этого оставшегося файла.

(Должна быть ориентированная на пользователя команда Git, которая сделает все это за вас, но нет 't.)


1 Я называю их "расширенными опциями" или "расширенными стратегическими вариантами", чтобы учесть письмо X. Документация Git просто называет их «вариантами стратегии», что вводит в заблуждение, потому что опция -s выбирает стратегию и, следовательно, является вариантом стратегии. Таким образом, аргументы -X являются опциями стратегии, отличными от опции стратегии. (Как говорится, «Очистить как грязь».) Сказать, что -s является стратегическим вариантом, а -X предоставляет расширенные параметры, кажется гораздо менее запутанным.

...