При применении патча есть ли способ разрешить конфликты?

124

Я на окнах.

По разным причинам у нас есть несколько экземпляров git разных веток svn.

Много раз я хочу исправить проблему в репозитории A, сгенерировать патч и применить его к репозиторию B. Это работает нормально, за исключением конфликтов.

При перебазировании я просто щелкаю папку правой кнопкой мыши, использую tortioseGit и выбираю параметр разрешения. Это вызывает хороший интерфейс, позволяющий мне работать с моими конфликтами.

Есть ли способ добиться этого с помощью отклоненных фрагментов исправлений?

Вот мой текущий подход к созданию / применению патчей

git format-patch master --stdout > c:\\patch\\file.patch
git apply --reject --ignore-space-change --ignore-whitespace c:\\patch\\file.patch
Kenoyer130
источник
3
Я обычно делаю это вручную, когда все варианты исправления не работают ...
stdcall
Если слияние не удается, это потому, что программа не может понять, как однозначно выполнить слияние. Вы должны получить файл с наборами <<<<, ===, >>>>, и вы должны войти и решить их вручную.
tacaswell 06
Да, делать это вручную - настоящая лаваша, когда ты говоришь несколько сотен рэдж-ханков.
Kenoyer130 06
Вот когда вы захотите использовать git mergetoolи выполнить трехстороннее слияние с графическим интерфейсом по вашему выбору (я неравнодушен к kdiff в Windows) ...
g19fanatic

Ответы:

254

Чтобы сгенерировать патч, сделайте следующее:

git format-patch --stdout first_commit^..last_commit > changes.patch

Теперь, когда вы готовы применить патчи:

git am -3 < changes.patch

при -3возникновении конфликтов будет выполнено трехстороннее слияние. На этом этапе вы можете сделать , git mergetoolесли вы хотите , чтобы перейти к графическому интерфейсу или просто вручную объединить файлы с помощью Vim (стандарт <<<<<<, ||||||, >>>>>>разрешения конфликтов).

g19fanatic
источник
3
Это может быть полезно добавить --ignore-whitespace --ignore-space-changeв git amтоже. У меня были тривиальные слияния, которые без этого не прошли.
angularsen
12
git apply -3 changes.patchКажется, у меня тоже работает
peterflynn
1
Несмотря на то, что патч не применяется чисто, я все равно получаю сообщение «Файлы не нужно объединять» git mergetool. Вместо этого мне пришлось найти базовую фиксацию используемого исходного патча, применить поверх него (к счастью, в моем репо это было), а затем переустановить.
jozxyqk
4
У меня та же проблема, что и у @jozxyqk. На самом деле git am -3ни один из git apply -3маркеров конфликта не будет помещен в мои файлы, даже если я получаю сообщения типа Applied patch to 'configure.ac' with conflicts.и error: patch failed: .... Это идет git 2.17.1. Возможно, когда некоторые файлы вообще нельзя исправить, git откатывается?
nh2
1
У меня та же проблема, что и у @ nh2, вы когда-нибудь сталкивались с проблемой?
Эриданис 01
12

Если вы часто сталкиваетесь с одним и тем же набором конфликтов при применении исправлений, ребазировании или слиянии, вы можете использовать функцию git rerere (повторное использование записанного разрешения). Это позволяет вам заранее определить, как следует разрешать конфликты, исходя из того, как вы разрешали их в прошлом. См. Http://git-scm.com/blog/2010/03/08/rerere.html для получения подробной информации о том, как это работает.

mplf
источник
5

TortoiseGit имеет функцию слияния, которая может открывать файлы патчей.

Там картинка его здесь .

военно-картографическая служба
источник
На самом деле вариант слияния может быть тем, что я ищу.
Kenoyer130 06
В самом деле? Я давно не использовал черепаху, но на связанной странице есть текст «TortoiseMerge может напрямую открыть файл патча Git, вы просматриваете его и исправляете в рабочую копию.», Так что похоже, что должен!
AMS 07
он открывает файлы патчей ... однако иногда формат файла патча нарушает работу tortoisegitmerge. Я никогда не добивался успеха с diff -u, а с выводом diff -c.
thistleknot
Вы также можете перетащить патчи правой кнопкой мыши в папку рабочего дерева и выбрать «Применить серийный патч» (для таких патчей, как 0001-xxx.patch, ... 0002-xxy.patch) или «Применить отдельный файл патча».
MrTux
2

Мой подход:

  • Создайте ветвь «Интеграция», где файлы идентичны.
  • Примените патч к этой ветви интеграции
  • Объедините или переустановите его в master (не знаю, полезна ли здесь перебазировка, потому что я не знаю, что произойдет при применении дальнейших исправлений)
MichiBack
источник