Есть ли способ разрешить конфликт для всех файлов с помощью checkout --ours
и --theirs
? Я знаю, что вы можете сделать это для отдельных файлов, но не смог найти способ сделать это для всех.
Есть ли способ разрешить конфликт для всех файлов с помощью checkout --ours
и --theirs
? Я знаю, что вы можете сделать это для отдельных файлов, но не смог найти способ сделать это для всех.
Ответы:
Просто выполните grep через рабочий каталог и отправьте вывод с помощью команды xargs:
grep -lr '<<<<<<<' . | xargs git checkout --ours
или
grep -lr '<<<<<<<' . | xargs git checkout --theirs
Как это работает: grep
будет выполнять поиск в каждом файле в текущем каталоге ( .
) и подкаталогах рекурсивно ( -r
флаг) в поисках маркеров конфликта (строка '<<<<<<<')
-l
или --files-with-matches
флаг заставляет Grep выводить только имя файла , где была найдена строка. Сканирование останавливается после первого совпадения, поэтому каждый найденный файл выводится только один раз.
Совпавшие имена файлов затем поступают в xargs , утилиту , которая разбивает входной поток водопроводных в отдельные аргументы для git checkout --ours
или--theirs
Подробнее по этой ссылке .
Поскольку было бы очень неудобно вводить это каждый раз в командной строке, если вы обнаружите, что часто используете его, было бы неплохо создать псевдоним для вашей оболочки по выбору: Bash - это обычный .
Этот метод должен работать как минимум в Git версии 2.4.x
git diff --name-only --diff-filter=U
.
git status | grep both | awk '{print $3}' | xargs git checkout --[theirs|ours]
. Быстрее, чем grepping, если у вас большой проект.
CONFLICT (rename/rename): Rename "a.txt"->"c.txt" in branch "HEAD" rename "a.txt"->"b.txt" in "master"
git status --porcelain | egrep '^UU' | cut -d ' ' -f 2 |xargs git checkout --[theirs|ours]
.
Вы можете -Xours
или -Xtheirs
с git merge
. Так:
git reset --hard HEAD
)git merge -Xours
или git merge -Xtheirs
)ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: конечно, вы можете выбрать только один вариант, -Xours
или -Xtheirs
, если вы используете другую стратегию, вы, конечно, должны идти файл за файлом.
Я не знаю, есть ли способ checkout
, но я, честно говоря, не думаю, что это ужасно полезно: выбор стратегии с помощью команды checkout полезен, если вам нужны разные решения для разных файлов, в противном случае просто используйте подход стратегии слияния.
--theirs
или --ours
-Option. Подход был бы git merge -s recursive -Xtheirs BRANCH
.
--theirs
и --ours
недоступны ни с git 2.2.0
. Либо мой ответ был неточным, либо они были доступны в более старой версии git (этот ответ довольно старый в эпоху ИТ). Правильный подход - с -X
. Я обновляю соответственно
git checkout --[ours/theirs] .
будет делать то, что вы хотите, до тех пор, пока вы находитесь в корне всех конфликтов. ours / theirs влияет только на не объединенные файлы, поэтому вам не нужно специально выявлять конфликты grep / find / etc.
error: path 'foo/bar/blah' does not have our version
.
git diff --name-only --diff-filter=U | xargs git checkout --theirs
Кажется, делает свою работу. Обратите внимание, что для этого вам необходимо перейти в корневой каталог репозитория git.
В случае, если кто-то еще хочет просто перезаписать все из одной ветки (скажем, master) содержимым другой, есть более простой способ:
git merge origin/master --strategy=ours
Благодаря https://stackoverflow.com/a/1295232/560114
Или, наоборот, см. Существует ли «их» версия команды «git merge -s ours»?
git checkout --ours -- .
? В.
означает текущий каталог, когда применяются от корня рабочего каталога, так что это в основном означает весь рабочий каталог. Не уверен, что это сработает с--ours
флагом, и я не уверен, как он будет обрабатывать конфликты удаленных или переименованных файлов.