Czy podczas stosowania poprawki istnieje sposób na rozwiązanie konfliktów?

124

Jestem w oknach.

Z różnych powodów mamy wiele instancji git różnych gałęzi svn.

Wiele razy chcę naprawić problem w repozytorium A, wygenerować poprawkę i zastosować ją do repozytorium B. Działa to dobrze, chyba że występują konflikty.

Podczas zmiany bazy po prostu klikam folder prawym przyciskiem myszy i używam tortioseGit i wybieram opcję rozwiązania. Pojawi się fajny GUI, który pozwoli mi rozwiązać moje konflikty.

Czy jest jakiś sposób, aby to osiągnąć z odrzuconymi fragmentami łaty?

Oto moje obecne podejście do tworzenia / nakładania łatek

git format-patch master --stdout > c:\\patch\\file.patch
git apply --reject --ignore-space-change --ignore-whitespace c:\\patch\\file.patch
Kenoyer130
źródło
3
Zwykle robię to ręcznie, gdy zawiodą wszystkie opcje łatania ...
stdcall
Jeśli scalanie nie powiedzie się, to dlatego, że program nie może wymyślić, jak jednoznacznie wykonać scalanie. Powinieneś dostać plik z zestawami <<<<, ===, >>>> i musisz wejść i rozwiązać je ręcznie.
tacaswell
Tak, robienie tego ręcznie to prawdziwa pita, gdy mówisz kilka 100 razy.
Kenoyer130
Wtedy chciałbyś użyć git mergetooli wykonać 3-drożne scalanie z wybranym przez ciebie GUI (jestem stronniczy w kdiff w Windows) ...
g19fanatic

Odpowiedzi:

254

Aby wygenerować poprawkę, wykonaj następujące czynności:

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

Teraz, gdy jesteś gotowy do nałożenia plastrów:

git am -3 < changes.patch

-3zrobi trójdrożny seryjnej czy istnieją konflikty. W tym momencie można zrobić git mergetool, jeśli chcesz iść do gui lub po prostu ręcznie scalić pliki przy użyciu vim (średnia <<<<<<, ||||||, >>>>>>rozwiązywanie konfliktów).

g19fanatic
źródło
3
Może to być przydatne, aby dodać --ignore-whitespace --ignore-space-changedo git amzbyt. Miałem trywialne połączenia, które bez tego nie przebiegały.
angularsen
12
git apply -3 changes.patchwydaje się, że działa również dla mnie
peterflynn
1
Mimo że łatka nie działa poprawnie, nadal otrzymuję komunikat „Żadne pliki nie wymagają scalania” git mergetool. Zamiast tego musiałem znaleźć zatwierdzenie bazowe oryginalnej łatki, nałożyć ją na to (na szczęście moje repozytorium to miało), a następnie ponownie bazować.
jozxyqk
4
Mam ten sam problem co @jozxyqk. Ani git am -3też nie git apply -3będzie faktycznie spaść markery konfliktowych do moich plików, chociaż dostać wiadomości jak Applied patch to 'configure.ac' with conflicts.i error: patch failed: .... To jest włączone git 2.17.1. Może jeśli niektórych plików nie da się w ogóle załatać, git wycofuje się?
nh2
1
Mam ten sam problem co @ nh2, czy kiedykolwiek znalazłeś problem?
Eridanis
12

Jeśli często napotykasz ten sam zestaw konfliktów podczas stosowania poprawek, zmiany bazy lub scalania, możesz użyć funkcji git rerere (ponowne użycie nagranego rozwiązania). Pozwala to wstępnie zdefiniować, jak konflikty powinny być rozwiązywane na podstawie tego, jak rozwiązałeś je w przeszłości. Zobacz http://git-scm.com/blog/2010/03/08/rerere.html, aby dowiedzieć się, jak to działa.

mplf
źródło
5

TortoiseGit ma funkcję scalania, która może otwierać pliki łat.

Jest to obraz o tym tutaj .

ams
źródło
Właściwie opcja scalania może być tym, czego szukam.
Kenoyer130
Naprawdę? Od dawna nie używałem żółwia, ale strona, do której prowadzi łącze, zawiera tekst „TortoiseMerge może bezpośrednio otworzyć plik poprawki Git, przejrzyj go i załataj kopię roboczą”, więc wydaje się, że powinno!
rano,
otwiera pliki łat ... jednak czasami format pliku łaty psuje tortoisegitmerge. Nigdy nie udało mi się z diff -u, ale raczej wyjściem diff -c.
thistleknot
Możesz także przeciągnąć łaty prawym przyciskiem myszy do folderu drzewa roboczego i wybrać opcję „Zastosuj numer seryjny poprawki” (dla poprawek takich jak 0001-xxx.patch, ... 0002-xxy.patch) lub „Zastosuj pojedynczy plik poprawki”.
MrTux,
2

Moje podejście jest następujące:

  • Utwórz gałąź „Integracja”, w której pliki są identyczne
  • Zastosuj poprawkę do tej gałęzi integracji
  • Scal lub przebuduj go na master (nie wiem, czy rebase jest tutaj przydatny, ponieważ nie wiem, co się stanie po zastosowaniu kolejnych łat)
MichiBack
źródło