Есть ли способ разрешить конфликт для всех файлов с помощью checkout --ours
и --theirs
? Я знаю, что вы можете сделать это для отдельных файлов, но не смог найти способ сделать это для всех.
113
Есть ли способ разрешить конфликт для всех файлов с помощью checkout --ours
и --theirs
? Я знаю, что вы можете сделать это для отдельных файлов, но не смог найти способ сделать это для всех.
git checkout --ours -- .
? В.
означает текущий каталог, когда применяются от корня рабочего каталога, так что это в основном означает весь рабочий каталог. Не уверен, что это сработает с--ours
флагом, и я не уверен, как он будет обрабатывать конфликты удаленных или переименованных файлов.Ответы:
Просто выполните grep через рабочий каталог и отправьте вывод с помощью команды xargs:
или
Как это работает:
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
недоступны ни с git2.2.0
. Либо мой ответ был неточным, либо они были доступны в более старой версии git (этот ответ довольно старый в эпоху ИТ). Правильный подход - с-X
. Я обновляю соответственноgit checkout --[ours/theirs] .
будет делать то, что вы хотите, до тех пор, пока вы находитесь в корне всех конфликтов. ours / theirs влияет только на не объединенные файлы, поэтому вам не нужно специально выявлять конфликты grep / find / etc.источник
error: path 'foo/bar/blah' does not have our version
.Кажется, делает свою работу. Обратите внимание, что для этого вам необходимо перейти в корневой каталог репозитория git.
источник
В случае, если кто-то еще хочет просто перезаписать все из одной ветки (скажем, master) содержимым другой, есть более простой способ:
Благодаря https://stackoverflow.com/a/1295232/560114
Или, наоборот, см. Существует ли «их» версия команды «git merge -s ours»?
источник
Я добавил эту функцию в файл .zshrc .
Используйте их так:
gitcheckoutall theirs
илиgitcheckoutall ours
источник