Чи застосовується виправлення, чи є спосіб вирішити конфлікти?


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

3
Зазвичай я це роблю вручну, коли всі параметри виправлення не вдається ...
stdcall

Якщо злиття не вдається, це тому, що програма не може зрозуміти, як недвозначно зробити злиття. Ви повинні отримати файл з наборами <<<<, ===, >>>>, і вам доведеться зайти та вирішити їх вручну.
tacaswell

Так, це робити вручну - це справжня лаваш, коли ти розмовляєш з кількома сотнями штук.
Kenoyer130

Ось тоді ви хочете скористатись 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 (стандарт <<<<<<, ||||||, >>>>>>вирішення конфліктів).


3
Це може бути корисно додати --ignore-whitespace --ignore-space-changeв git amтеж. У мене були банальні злиття, які не пройшли без нього.
angularsen

12
git apply -3 changes.patchздається, працює і для мене
peterflynn

1
Незважаючи на те, що патч не застосовується чисто, я все одно отримую "Жодних файлів не потрібно об'єднувати" git mergetool. Натомість мені довелося знайти базовий фіксатор використаного оригінального патча, застосувати поверх цього (на щастя, у мого репо було це), а потім відновити rebase.
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, ви коли-небудь знайшли проблему?
Еріданіс

12

Якщо ви часто наштовхуєтесь на один і той же набір конфліктів під час застосування патчів, перезапуску чи об'єднання, ви можете використовувати функцію git rerere (повторне використання записаного дозволу). Це дозволяє заздалегідь визначити, як конфлікти слід вирішувати, виходячи з того, як ви їх вирішували в минулому. Дивіться http://git-scm.com/blog/2010/03/08/rerere.html, щоб дізнатись, як це працює.


5

TortoiseGit має функцію злиття, яка може відкривати файли виправлень.

Там картинка його тут .


Насправді варіант злиття може бути тим, що я шукаю.
Kenoyer130

Дійсно? Я давно не користувався черепахою, але на пов’язаній сторінці є текст "TortoiseMerge може відкрити файл патчу Git безпосередньо, ви переглянете його та приєднаєте до робочої копії".
Ams

він відкриває файли патчів ... однак, іноді формат файлу патчів порушує tortoisegitmerge. я ніколи не був успішним з diff -u, але скоріше diff -c вихід.
thistleknot

Ви також можете перетягнути патчі в робочу папку дерева і вибрати "Застосувати серійний патч" (для патчів, таких як 0001-xxx.patch, ... 0002-xxy.patch) або "Застосувати один файл патча".
MrTux

2

Мій підхід:

  • Створіть "Інтеграцію" -Branch, де файли однакові
  • Застосуйте виправлення до цієї інтеграції-відділення
  • Об’єднайте або відновіть його до master (не знаю, чи корисна тут версія, тому що я не знаю, що буде при застосуванні подальших патчів)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.