Чи є спосіб вирішити конфлікт для всіх файлів за допомогою каси --ours
та --theirs
? Я знаю, що ви можете зробити це для окремих файлів, але не вдалося знайти спосіб зробити це для всіх.
Чи є спосіб вирішити конфлікт для всіх файлів за допомогою каси --ours
та --theirs
? Я знаю, що ви можете зробити це для окремих файлів, але не вдалося знайти спосіб зробити це для всіх.
Відповіді:
Просто прогляньте робочий каталог і надішліть вихід через команду xargs:
grep -lr '<<<<<<<' . | xargs git checkout --ours
або
grep -lr '<<<<<<<' . | xargs git checkout --theirs
Як це працює: grep
буде шукати кожен файл у поточному каталозі (the .
) та підкаталогах рекурсивно ( -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]
. Швидше ніж привітання, якщо у вас великий проект.
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
, але я чесно не думаю, що це страшно корисно: вибір стратегії за допомогою команди оформлення замовлення корисний, якщо ви хочете різні рішення для різних файлів, інакше просто перейдіть до підходу стратегії злиття.
--theirs
або --ours
-Опція git v1.9.4. Підхід був би git merge -s recursive -Xtheirs BRANCH
.
--theirs
і --ours
не доступні ні з git 2.2.0
. Або моя відповідь не була точною, або вони були доступні у старшій версії git (ця відповідь досить стара в епоху ІТ). Правильний підхід - с -X
. Я відповідно
git checkout --[ours/theirs] .
буде робити те, що ви хочете, до тих пір, поки ви знаходитесь в корені всіх конфліктів. наше / їхнє впливає лише на неперероблені файли, тому вам не потрібно конкретно конфліктувати / знаходити / тощо.
error: path 'foo/bar/blah' does not have our version
.
git diff --name-only --diff-filter=U | xargs git checkout --theirs
Здається, виконати роботу. Зауважте, що для цього вам потрібно ввести cd'ed в кореневий каталог git repo.
У випадку, якщо хтось інший хоче просто перезаписати все з однієї гілки (скажімо, майстер) вмістом іншої, є більш простий спосіб:
git merge origin/master --strategy=ours
Дякуємо за https://stackoverflow.com/a/1295232/560114
Або навпаки, див. Чи існує "їхня" версія "git merge -s our"?
git checkout --ours -- .
працює? Це.
означає, що поточний каталог застосовується з кореня робочого каталогу, тому він в основному означає весь робочий каталог. Не впевнений, чи це буде працювати з--ours
прапором, і я не впевнений, як він буде обробляти конфлікти видалених чи перейменованих файлів.