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.