Na stronie podręcznika git-merge dostępnych jest wiele strategii scalania.
resolver - To może rozwiązać tylko dwie głowy (tj. bieżącą gałąź i inną gałąź, z której wyciągnąłeś) przy użyciu 3-kierunkowego algorytmu scalania. Próbuje ostrożnie wykrywać niejednoznaczności łączenia krzyżowego i jest ogólnie uważany za bezpieczny i szybki.
rekurencyjny - To może rozwiązać tylko dwie głowy za pomocą 3-kierunkowego algorytmu scalania. Jeśli istnieje więcej niż jeden wspólny przodek, którego można użyć do łączenia 3-kierunkowego, tworzy ono połączone drzewo wspólnych przodków i używa go jako drzewa referencyjnego dla łączenia 3-kierunkowego. Zgłoszono, że powoduje to mniej konfliktów scalania bez powodowania błędnego łączenia przez testy wykonane na rzeczywistych zatwierdzeniach scalania pobranych z historii rozwoju jądra Linux 2.6. Dodatkowo może to wykrywać i obsługiwać połączenia obejmujące zmiany nazw. Jest to domyślna strategia scalania podczas ciągnięcia lub łączenia jednej gałęzi.
ośmiornica - rozwiązuje więcej niż dwie głowy, ale odmawia wykonania skomplikowanego scalania, które wymaga ręcznego rozwiązania. Jest przeznaczony przede wszystkim do łączenia ze sobą głów oddziałów tematycznych. Jest to domyślna strategia scalania podczas ciągnięcia lub łączenia więcej niż jednej gałęzi.
nasz - To rozwiązuje dowolną liczbę głów, ale wynikiem scalania jest zawsze bieżąca głowa główki. Ma on służyć do zastąpienia starej historii rozwoju bocznych gałęzi.
poddrzewo - jest to zmodyfikowana strategia rekurencyjna. Podczas łączenia drzew A i B, jeśli B odpowiada poddrzewowi A, B jest najpierw dostosowywane do struktury drzewa A, zamiast odczytywania drzew na tym samym poziomie. Korekta ta jest również wykonywana dla wspólnego drzewa przodków.
Kiedy powinienem podać coś innego niż domyślny? Dla jakich scenariuszy każdy jest najlepszy?
git merge A B ...
).-X ours
jest niesamowita, właśnie zaoszczędziła mi godzinę pracy.Właściwie jedyne dwie strategie, które chciałbyś wybrać, są nasze, jeśli chcesz porzucić zmiany wprowadzone przez gałąź, ale zachowaj gałąź w historii i poddaj się, jeśli łączysz niezależny projekt w podkatalogu superprojektu (np. „Git-gui” w „ repozytorium git).
Scalanie ośmiornicy jest używane automatycznie podczas łączenia więcej niż dwóch gałęzi. Rozwiązanie jest tutaj głównie z powodów historycznych, a także w przypadku, gdy trafiają Cię przypadki narożników strategii scalania rekurencyjnego .
źródło
theirs
strategii scalania (to znaczy--strategy=theirs
), ale istniejetheirs
opcja domyślnejrecursive
strategii scalania (to znaczy--strategy=recursive --strategy-option=theirs
lub po prostu-Xtheirs
).Strategia scalania „Resolve” vs „Recursive”
Rekursywna jest obecnie domyślną strategią dwóch głowic, ale po kilku poszukiwaniach w końcu znalazłem informacje o strategii scalania „rozstrzygnij”.
Zaczerpnięte z książki O'Reilly Kontrola wersji z Git ( Amazon ) (parafraza):
Pomyślnie scaliłem drzewa przy użyciu „rozwiązania”, które nie powiodło się przy domyślnej strategii rekurencyjnej. Otrzymywałem
fatal: git write-tree failed to write a tree
błędy i dzięki temu wpisowi na blogu ( kopia lustrzana ) próbowałem „-s rozwiązać”, który zadziałał. Nadal nie jestem do końca pewien, dlaczego ... ale myślę, że było tak, ponieważ miałem zduplikowane zmiany w obu drzewach i rozwiązałem je poprawnie.źródło
Ponieważ powyższe odpowiedzi nie pokazują wszystkich szczegółów strategii. Na przykład, niektóre odpowiedź brakuje szczegółów dotyczących importu
resolve
opcji irecursive
który ma wiele opcji jako podrzędneours
,theirs
,patience
,renormalize
, itd.Dlatego polecam odwiedzić oficjalną
git
dokumentację, która wyjaśnia wszystkie możliwe funkcje:https://git-scm.com/docs/merge-strategies
źródło