2011-02-09 10 views
16

Podejmij prosty przykład: pracuję nad domyślną gałęzią, mam kilka zestawów zmian zatwierdzonych lokalnie i wyciągnąłem kilka z głównego repozytorium. Pracowałem przez kilka dni w moim izolowanym lokalnym repozytorium, więc jest sporo zmian, które można scalić, zanim będę mógł ponownie wprowadzić wyniki do wzorca.Czy scalanie kierunku ma znaczenie w Mercurial?

default ---o-o-o-o-o-o-o-o-o-o-o (pulled stuff) 
      \ 
      o----o------------o (my stuff) 

Mogę teraz zrobić dwie rzeczy.

Wariant nr 1:

hg pull 
hg merge 

Wynik 1:

default ---o-o-o-o-o-o-o-o-o-o-o 
      \     \ 
      o----o------------o-O 

Wariant nr 2:

hg pull 
hg update 
hg merge 

Wynik 2:

default ---o-o-o-o-o-o-o-o-o-o-o-O 
      \     /
      o----o------------o 

Te dwa wyniki wyglądają dla mnie izomorficznie, ale w praktyce wydaje się, że opcja nr 2 ma mniejszy zestaw zmian (ponieważ stosuje tylko kilka zmian w linii głównej, zamiast stosować wszystkie zmiany w mojej linii głównej).

Moje pytanie brzmi: czy to ma znaczenie? Czy powinienem dbać o kierunek moich połączeń? Czy oszczędzam miejsce, jeśli to zrobię? (Wykonanie hg log --patch --rev tip po fuzji sugeruje).

Odpowiedz

14

Są (skutecznie) identyczne. Widzisz różnicę w rozmiarze wyjściowym hg log --patch --rev X, ponieważ log pokazuje różnicę wyniku i (dowolnie) jego "lewy" rodzic (oficjalnie p1), ale to nie jest sposób przechowywania (Mercurial ma binarny format zapisu diff, który nie jest łatką/diff) i teraz jest obliczane (p1, p2 i najnowszy-common-przodek są używane).

Jedyna rzeczywista różnica polega na tym, że jeśli używasz nazwanych oddziałów, nazwa oddziału będzie tą z lewej strony nadrzędnej.

2

Istnieje również różnica, jeśli używasz Zakładek. Podczas scalania gałąź, którą jesteś, jest gałęzią, która otrzymuje zmiany, więc nowy zestaw zmian będzie częścią tej gałęzi. Supose masz taką sytuację:

default ---o-o-o-o-o-o-o-o-o-o-o -- Head: Rev 200 
      \ 
      o----o------------o -- Head: Rev 195, Bookmark: my-stuff 

Jeśli połączyć Rev Rev 200 do 195, zakładka my-stuff przejdzie do rev 201, jak jesteś generowania nowego changeset w tej samej branży, która ma zakładkę.

Z drugiej strony, jeśli scalisz 195 w 200, generujesz zestaw zmian w oddziale, który nie ma zakładki. Zakładka my-stuff pozostanie w Rev 195.

+1

Jest to szczególnie ważne, jeśli używasz [Hg-Git] (http://hg-git.github.com/), ponieważ to śledzi pozycję wirtualnych gałęzi Git za pomocą zakładek. Jeśli dokonasz scalenia w niewłaściwy sposób, zakładka Git nie zostanie przeniesiona i nie będziesz miał nic do przeforsowania. –

+0

Łączenie 200 w 195 nie gwarantuje przeniesienia zakładki do przodu do 201. Jeśli wykonasz 'hg update my-stuff; hg scalanie 200 'będzie, ale jeśli zrobisz 'hg update 195; hg scalanie 200 "nie będzie. Aktualizacja według nazwy zakładki czyni ją * aktywną *. –