Git разрешить конфликт с использованием --ours/- их для всех файлов

Есть ли способ разрешить конфликт для всех файлов с помощью checkout --ours и --theirs? Я знаю, что вы можете сделать это для отдельных файлов, но не смогли найти способ сделать это для всех.

Ответ 1

Просто grep через рабочий каталог и отправьте результат через команду xargs:

grep -lr '<<<<<<<' . | xargs git checkout --ours

или

grep -lr '<<<<<<<' . | xargs git checkout --theirs

Как это работает: grep будет искать каждый файл в текущем каталоге (.) и подкаталоги рекурсивно (флаг -r), который ищет маркеры конфликтов (строка '< < < < < < lt; < < < ')

флаг -l или --files-with-matches заставляет grep выводить только имя файла, в котором была найдена строка. Сканирование останавливается после первого совпадения, поэтому каждый согласованный файл выводится только один раз.

Соответствующие имена файлов затем > > xargs, утилита, которая разбивает каналы входной поток в отдельные аргументы для git checkout --ours или --theirs

Подробнее по этой ссылке.

Так как было бы очень неудобно вводить это каждый раз в командной строке, если вы часто используете его, может быть неплохо создать alias для вашей оболочки выбора: Bash является обычным.

Этот метод должен работать как минимум Git версии 2.4.x

Ответ 2

Вы можете -Xours или -Xtheirs с помощью git merge. Итак:

  • прервать текущее слияние (например, с git reset --hard HEAD)
  • слияние с использованием предпочтительной стратегии (git merge -Xours или git merge -Xtheirs)

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: конечно, вы можете выбрать только один вариант: -Xours или -Xtheirs, используйте другую стратегию, вы должны, конечно, идти файл по файлу.

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

Ответ 3

git checkout --[ours/theirs] . будет делать то, что вы хотите, до тех пор, пока вы находитесь в корне всех конфликтов. ours/theirs влияет только на несвязанные файлы, поэтому вам не обязательно иметь проблемы с grep/find/etc.

Ответ 4

git diff --name-only --diff-filter=U | xargs git checkout --theirs

Кажется, нужно выполнить эту работу. Обратите внимание, что для достижения этой цели вы должны быть cd'ed в корневой каталог репозитория git.