Есть ли способ разрешить конфликт для всех файлов с помощью 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флагом, и я не уверен, как он будет обрабатывать конфликты удаленных или переименованных файлов.