Kiedy użyjesz różnych strategii Git merge?

Ze strony podręcznika Git-merge można użyć wielu strategii scalania.

  • resolve - Może to rozwiązać tylko dwie głowice (tj. bieżącą gałąź i inną gałąź, z której wyciągnąłeś) za pomocą algorytmu 3-way merge. Stara się dokładnie wykrywać niejednoznaczności krzyżowo-krzyżowe i jest uważany za ogólnie bezpieczny i szybki.

  • recursive - Może to rozwiązać tylko dwie głowice za pomocą algorytmu scalania 3-way. Gdy jest więcej niż jeden wspólne przodków, które mogą być używane do 3-way merge, tworzy połączone drzewo wspólnych przodków i używa tego jako drzewa odniesienia dla 3-way merge. Raportowano, że skutkuje to mniejszą liczbą konfliktów scalania bez powodowania błędnych połączeń przez testy przeprowadzone na rzeczywistych commitach scalania pobranych z historii rozwoju jądra linuksa 2.6. Dodatkowo może to wykrywać i obsługiwać połączenia obejmujące zmianę nazw. Jest to domyślna strategia scalania podczas ciągnięcia lub scalania branch.

  • octopus - Rozwiązuje to więcej niż dwugłowy przypadek, ale odmawia wykonania skomplikowanego połączenia, które wymaga ręcznego rozwiązania. Jest przeznaczony przede wszystkim do łączenia głowic tematycznych. Jest to domyślna strategia scalania podczas ciągnięcia lub łączenia więcej niż jednej gałęzi.

  • nasze - Rozwiązuje to dowolną liczbę głowic, ale wynikiem połączenia jest zawsze bieżąca Głowica gałęzi. Ma być stosowany w celu zastąpienia starego rozwoju historia oddziałów bocznych.

  • subtree - Jest to zmodyfikowana strategia rekurencyjna. Podczas łączenia drzew A i B, Jeśli B odpowiada podzbiorowi A, B jest najpierw dopasowywane do struktury drzewa A, zamiast odczytywać drzewa na tym samym poziomie. Ta korekta jest również wykonywana dla wspólnego drzewa przodków.

Kiedy powinienem podać coś innego niż domyślne? Do jakich scenariuszy najlepiej pasują?

Author: Otto, 2008-12-14

3 answers

Nie znam się na resolve, ale korzystałem z innych:

Rekurencyjne

Rekurencyjna jest domyślna dla połączeń bez przewijania do przodu. Wszyscy to znamy.

Octopus

Używałem ośmiornicy, gdy miałem kilka drzew, które trzeba było połączyć. Widać to w większych projektach, w których wiele oddziałów miało niezależny rozwój i wszystko jest gotowe do połączenia w jedną głowę.

Gałąź octopus łączy wiele głowic w jednym commicie jako dopóki potrafi to zrobić czysto.

Dla ilustracji, wyobraź sobie, że masz projekt, który ma master, a następnie trzy gałęzie do scalenia (nazwij je a, b i c).

Seria mergów rekurencyjnych wyglądałaby tak (zauważ, że pierwsze mergowanie było szybkie, ponieważ nie wymusiłem rekurencji):

seria mergów rekurencyjnych

Jednak jedno połączenie ośmiornicy wyglądałoby tak:

commit ae632e99ba0ccd0e9e06d09e8647659220d043b9
Merge: f51262e... c9ce629... aa0f25d...

octopus merge

Nasz

Nasz = = chcę wciągnąć inny głowa, ale odrzuć wszystkie zmiany, które wprowadza Głowa.

To zachowuje historię gałęzi bez żadnych skutków gałęzi.

(Czytaj: nawet nie jest oglądane na zmiany między tymi gałęziami. Gałęzie są po prostu scalane i nic nie jest robione z plikami. Jeśli chcesz połączyć się z inną gałęzią i za każdym razem pojawia się pytanie" nasza Wersja pliku lub ich Wersja " możesz użyć git merge -X ours)

Subtree

Subtree jest przydatne, gdy chcesz połączyć się w kolejny projekt do podkatalogu bieżącego projektu. Przydatne, gdy masz bibliotekę, której nie chcesz dołączać jako podmodułu.

 285
Author: Dustin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-13 23:06:20

W rzeczywistości jedyne dwie strategie, które chcesz wybrać to Nasza jeśli chcesz zrezygnować ze zmian wprowadzonych przez branch, ale zachować gałąź w historii, oraz poddtree Jeśli łączysz niezależny projekt do podkatalogu superproject (jak 'git-gui' w repozytorium 'git').

Octopus merge jest używany automatycznie podczas łączenia więcej niż dwóch gałęzi. resolve jest tutaj głównie ze względów historycznych, a gdy zostaniesz uderzony przez rekurencyjny połącz sprawy narożne strategii.

 42
Author: Jakub Narębski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-15 00:03:44

"Resolve" vs "Recursive" merge strategy

Rekurencyjna jest obecnie domyślną strategią dwugłowicową, ale po kilku poszukiwaniach w końcu znalazłem pewne informacje o strategii" resolve".

Zaczerpnięte z O ' Reilly book Kontrola wersji za pomocą Git (Amazon ) (parafrazowany):

Pierwotnie, "resolve" było domyślną strategią dla mergów Gita.

W sytuacjach criss-cross merge, gdzie istnieje więcej niż jedna możliwa podstawa scalania, rozwiązanie strategia działa tak: wybierz jedną z możliwych baz scalania i miej nadzieję na najlepsze. Nie jest tak źle, jak się wydaje. Często okazuje się, że użytkownicy pracowali nad różnymi częściami kodu. W takim przypadku, Git wykrywa, że remerguje pewne zmiany, które już zostały wprowadzone i pomija zduplikowane zmiany, unikając konfliktu. Lub, jeśli są to niewielkie zmiany, które powodują konflikt, przynajmniej konflikt powinien być łatwy w obsłudze dla dewelopera..

I udało się połączyć drzewa za pomocą opcji "resolve", która nie powiodła się przy domyślnej strategii rekurencyjnej. Dostawałem fatal: git write-tree failed to write a tree błędy, a dzięki ten wpis na blogu (mirror ) próbowałem "- s resolve" , co zadziałało. Nadal Nie wiem dlaczego... ale myślę, że to dlatego, że miałem zduplikowane zmiany w obu drzewach i rozwiązać "pominął" je prawidłowo.

 19
Author: thaddeusmt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-29 18:06:05