Git вирішує конфлікт, використовуючи --ours / - їх для всіх файлів


111

Чи є спосіб вирішити конфлікт для всіх файлів за допомогою каси --oursта --theirs? Я знаю, що ви можете зробити це для окремих файлів, але не вдалося знайти спосіб зробити це для всіх.


7
Чи git checkout --ours -- .працює? Це .означає, що поточний каталог застосовується з кореня робочого каталогу, тому він в основному означає весь робочий каталог. Не впевнений, чи це буде працювати з --oursпрапором, і я не впевнений, як він буде обробляти конфлікти видалених чи перейменованих файлів.

@Cupcake Я успішно використовував його. Може, це має бути відповіддю?
Педро Гімено

Відповіді:


90

Просто прогляньте робочий каталог і надішліть вихід через команду 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


14
Замість привітання я думаю, що це також можливо використовувати git diff --name-only --diff-filter=U.
Тайська

10
Також git status | grep both | awk '{print $3}' | xargs git checkout --[theirs|ours]. Швидше ніж привітання, якщо у вас великий проект.
Joshbodily

1
@joshbodily Приємно. У мене немає проектів настільки величезних, що я помітив би різницю, але я бачу, як це було б набагато швидше, особливо якщо змінилося декілька файлів порівняно із загальною кількістю в каталозі ----, що повинно бути нормальним здійснює.
Дмитро

1
Зауважте, що це не працює для перейменування / перейменування конфліктів, наприклад,CONFLICT (rename/rename): Rename "a.txt"->"c.txt" in branch "HEAD" rename "a.txt"->"b.txt" in "master"
Борек Бернар

1
Ще один варіант: git status --porcelain | egrep '^UU' | cut -d ' ' -f 2 |xargs git checkout --[theirs|ours].
Zitrax

52

Ви можете -Xoursабо -Xtheirsз git mergeтакож. Так:

  1. скасувати поточне злиття (наприклад, з git reset --hard HEAD)
  2. злиття, використовуючи стратегію, яку ви віддаєте перевагу ( git merge -Xoursабо git merge -Xtheirs)

ВІДМОВА ВІДПОВІДАЛЬНО: звичайно, ви можете вибрати лише один варіант, -Xoursабо -Xtheirsвикористовувати іншу стратегію.

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


Дякую, не знали, що вони мають "--ours" та "--theirs" для злиття. Здається, що для об'єднання вони насправді не є частиною '-s' стратегії, а є частиною '-X' рекурсивних варіантів. Наша-версія 'насправді просто замінює всі файли без злиття, і їх не існує.
exe163

Немає --theirsабо --ours-Опція git v1.9.4. Підхід був би git merge -s recursive -Xtheirs BRANCH.
fbmd

--theirsі --oursне доступні ні з git 2.2.0. Або моя відповідь не була точною, або вони були доступні у старшій версії git (ця відповідь досить стара в епоху ІТ). Правильний підхід - с -X. Я відповідно
оновлююсь

Станом на версію 2.4.0 - ваші та - їхні ще дуже доступні git-scm.com/docs/git-checkout
Дмитрій

Спробував це і отримав "автоматичне злиття не вдалося, виправити конфлікти". Ця команда явно не працює за призначенням, і я рекомендую уникати її - занадто баггі.
Адам

37

git checkout --[ours/theirs] .буде робити те, що ви хочете, до тих пір, поки ви знаходитесь в корені всіх конфліктів. наше / їхнє впливає лише на неперероблені файли, тому вам не потрібно конкретно конфліктувати / знаходити / тощо.


5
Для мене це, схоже, не повторюється у підкаталогах.
Даніель Бафман

5
Я отримую error: path 'foo/bar/blah' does not have our version.
Робін Грін

Я використовую git версії 2.16.2.Windows.1, і вона прекрасно працює для мене. Дякую!
Панквуд

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

Здається, виконати роботу. Зауважте, що для цього вам потрібно ввести cd'ed в кореневий каталог git repo.


3
Я думаю, що це краща відповідь, ніж голосований, оскільки (1) він стосується всіх файлів, а не лише робочого каталогу; і (2) він не матиме крихкості навколо стискання маркерів конфлікту. Команда 'git diff' тут перераховує всі неперекладені шляхи, саме це ми хочемо перевірити.
bchurchill

Приємно! Мене завжди хвилювала надійність конфлікту маркерів конфліктів
00-BBB


2
function gitcheckoutall() {
    git diff --name-only --diff-filter=U | sed 's/^/"/;s/$/"/' | xargs git checkout --$1
}

Я додав цю функцію у файл .zshrc .

Використовуйте їх таким чином: gitcheckoutall theirsабоgitcheckoutall ours

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.