2010-02-10 12 views
233

Skończyłem pracę nad odgałęzieniem funkcji feature-x. Chcę połączyć wyniki z powrotem do gałęzi default i zamknąć feature-x, aby pozbyć się go na wyjściu z hg branches.Jak prawidłowo zamknąć gałąź funkcji w Mercurial?

wymyśliłem następujący scenariusz, ale ma pewne problemy:

$ hg up default 
$ hg merge feature-x 
$ hg ci -m merge 
$ hg up feature-x 
$ hg ci -m 'Closed branch feature-x' --close-branch 

Więc feature-x Branch (changests 40 - 41) jest zamknięty, ale jest jeden nowy szef, oddział zamykający changeset 44, które zostaną wymienione w hg heads za każdym razem:

$ hg log ... 
o 44 Closed branch feature-x 
| 
| @ 43 merge 
|/| 
| o 42 Changeset C 
| | 
o | 41 Changeset 2 
| | 
o | 40 Changeset 1 
|/ 
o 39 Changeset B 
| 
o 38 Changeset A 
| 

Aktualizacja: Wygląda na to, że od wersji 1.5 Mercurial nie pokazuje już głowic zamkniętych gałęzi na wyjściu hg heads.

Czy można zamknąć połączoną gałąź bez opuszczania jeszcze jednej głowicy? Czy istnieje dokładniejszy sposób zamknięcia gałęzi funkcji?

Powiązane pytania:

+0

@Andrey: ale wskazany artykuł NIE tylko mówi o "--close-branch". Pokazuje * cztery * sposoby przycinania gałęzi. Jeśli naprawdę tego nie chcesz, możesz klonować zgodnie z opisem w artykule. Jedyny "problem" polega na tym, że z jakiegoś powodu chcesz go zamknąć, a jednocześnie zachować go. – SyntaxT3rr0r

+1

@WizardOfOdds Tak, przeczytałem cały artykuł o przycinaniu martwych gałęzi. Chcę, aby oddział pozostał w historii zmian, a nie żeby go wyrzucić. Poprzednio po prostu scaliłem gałęzie funkcji w 'default' bez" zamykania "ich. Zaowocowało to 0 nowymi głowami, ale takie gałęzie były na zawsze widoczne w gałęziach 'hg' (jako nieaktywne gałęzie). –

+0

Aby rozwinąć funkcje, sklonowuję całe repozytorium, a następnie scalam je z powrotem po zakończeniu funkcji. Nie lubię mieć pozostałości (zamkniętych) gałęzi w historii. – DanMan

Odpowiedz

211

Jednym ze sposobów jest po prostu zostawić scalone oddziały funkcji open (i nieaktywne):

$ hg up default 
$ hg merge feature-x 
$ hg ci -m merge 

$ hg heads 
    (1 head) 

$ hg branches 
default 43:... 
feature-x 41:... 
    (2 branches) 

$ hg branches -a 
default 43:... 
    (1 branch) 

Innym sposobem jest zamknięcie gałąź funkcji przed połączeniem za pomocą dodatkowego zatwierdzenia:

$ hg up feature-x 
$ hg ci -m 'Closed branch feature-x' --close-branch 
$ hg up default 
$ hg merge feature-x 
$ hg ci -m merge 

$ hg heads 
    (1 head) 

$ hg branches 
default 43:... 
    (1 branch) 

Pierwszy jest prostszy, ale pozostawia otwartą gałąź. Drugi nie pozostawia żadnych otwartych głowic/gałęzi, ale wymaga jeszcze jednego dodatkowego zatwierdzenia.Można połączyć ostatnie rzeczywiste zatwierdzenie z gałęzią funkcji z tym dodatkowym zatwierdzeniem przy użyciu --close-branch, ale należy wcześniej wiedzieć, które zatwierdzenie będzie ostatnim.

Aktualizacja: Ponieważ Mercurial 1.5 można zamknąć oddział w każdej chwili, więc nie pojawi się zarówno hg branches i hg heads więcej. Jedyną rzeczą, która może cię denerwować, jest to, że technicznie wykres wersji wciąż będzie miał jeszcze jedną wersję bez potomka.

Aktualizacja 2: Ponieważ Mercurial 1,8 zakładek stały się podstawową cechę Mercurial. Zakładki są wygodniejsze w rozgałęzianiu niż gałęzie nazwane. Zobacz też to pytanie:

+1

Nie jest prawdą, że 'Zakładki są wygodniejsze do rozgałęziania niż nazwane gałęzie'. Zakładki Hg to nie to samo co gałęzie Gita. Są pełne wielu skrajnych przypadków, które sprawiają, że nie nadają się one jako gałęzie. Na przykład: kiedy klonujesz repozytorium, otrzymasz ostatnie zatwierdzenie w gałęzi 'default'. Jeśli używasz zakładek, ten zestaw zmian odpowiada losowej (niestabilnej) zakładce. Jeśli użyjesz nazwanych gałęzi, otrzymasz najnowsze zatwierdzenie w gałęzi stabilny/domyślny, co zwykle jest tym, czego potrzebujesz. Zakładki dotrą tam pewnego dnia, ale jeszcze ich tam nie ma. – Gili

+0

Używam zakładek jako znaczników prywatnych, które są widoczne tylko w moim lokalnym repozytorium. Działają one jak przypomnienia o zestawach zmian, które muszę ponownie odwiedzić. – Gili

+0

Próbowałem postępować zgodnie z tym podejściem, ale nadal otrzymuję komunikat o błędzie podczas próby naciśnięcia: 'abort: push tworzy nowe zdalne gałęzie:'. Co mogłem zrobić źle? – kasperd

11

EDIT ouch, zbyt późno ... Wiem przeczytać Twój komentarz stwierdzając, że chcesz zachować funkcje x changeset wokół, więc podejście do klonowania tutaj nie działa.

Nadal pozostawiam tutaj odpowiedź, ponieważ może pomóc innym.

Jeśli chcesz całkowicie pozbyć się "funkcji X", ponieważ, na przykład, to nie zadziałało, możesz klonować. Jest to jedna z metod wyjaśnionych w artykule i działa, i mówi konkretnie o głowach.

O ile mi zrozumieć, trzeba to i chcą pozbyć się "Feature-x" głowy raz na zawsze:

@ changeset: 7:00a7f69c8335 
|\ tag:   tip 
| | parent:  4:31b6f976956b 
| | parent:  2:0a834fa43688 
| | summary:  merge 
| | 
| | o changeset: 5:013a3e954cfd 
| |/ summary:  Closed branch feature-x 
| | 
| o changeset: 4:31b6f976956b 
| | summary:  Changeset2 
| | 
| o changeset: 3:5cb34be9e777 
| | parent:  1:1cc843e7f4b5 
| | summary:  Changeset 1 
| | 
o | changeset: 2:0a834fa43688 
|/ summary:  Changeset C 
| 
o changeset: 1:1cc843e7f4b5 
| summary:  Changeset B 
| 
o changeset: 0:a9afb25eaede 
    summary:  Changeset A 

Więc to zrobić:

hg clone . ../cleanedrepo --rev 7 

I będziesz mieć następujące elementy, a zobaczysz, że funkcja-x rzeczywiście zniknęła:

@ changeset: 5:00a7f69c8335 
|\ tag:   tip 
| | parent:  4:31b6f976956b 
| | parent:  2:0a834fa43688 
| | summary:  merge 
| | 
| o changeset: 4:31b6f976956b 
| | summary:  Changeset2 
| | 
| o changeset: 3:5cb34be9e777 
| | parent:  1:1cc843e7f4b5 
| | summary:  Changeset 1 
| | 
o | changeset: 2:0a834fa43688 
|/ summary:  Changeset C 
| 
o changeset: 1:1cc843e7f4b5 
| summary:  Changeset B 
| 
o changeset: 0:a9afb25eaede 
    summary:  Changeset A 

Mogłem źle zrozumieć to, co chciałeś, ale proszę nie mod dół, wziąłem czas odtwarzającą przypadku użycia:)

+0

Tak, nie chcę usuwać historii. W każdym razie, dzięki. –

76

imho istnieją dwa przypadki dla oddziałów, które zapomniał zamknąć

Przypadek 1: oddział nie został włączony do domyślnie

w ten Przypadek, który aktualizuję do oddziału i wykonuję kolejne zatwierdzenie z --close-branch, niestety to wybiera gałąź, aby stać się nową wskazówką, a więc przed wysłaniem jej do innych klonów upewniam się, że prawdziwa końcówka otrzymuje więcej zmian, a inni nie mają wątpliwości co do tej dziwnej wskazówki.

hg up myBranch 
hg commit --close-branch 

Przypadek 2: oddział został włączony do domyślnie

sprawa ta nie, że znacznie różni się od przypadku 1 i może być rozwiązany poprzez powtórzenie czynności dla przypadku 1 i dwóch dodatkowych.

w tym przypadku aktualizuję zestaw zmian do oddziału, wykonuję kolejne zatwierdzenie z --close-branch i scalam nowy zestaw zmian, który stał się domyślnym napiwkiem. ostatnia operacja tworzy nową wskazówkę, która znajduje się w domyślnej gałęzi - HOORAY!

hg up myBranch 
hg commit --close-branch 
hg up default 
hg merge myBranch 

Mam nadzieję, że pomoże to przyszłym czytelnikom.

+3

Dobra jasna odpowiedź dla nowicjudzkiego nowicjusza, takiego jak ja. I dziękuję za nie używanie "ci", które nie jest wymienione jako jedno z poleceń hg help, więc nie wiem co to znaczy :) –

+7

@MB .: w takich przypadkach 'hg help ci' wyjaśni to do Ciebie. –

6

To dziwne, że nikt jeszcze nie zaproponował najbardziej solidny sposób zamykania oddziałów fabularnych ... Można tylko połączyć scalającej z --close Hisa flagi (tj commit zmodyfikowane pliki i zamknij oddział jednocześnie):

hg up feature-x 
hg merge default 
hg ci -m "Merge feature-x and close branch" --close-branch 
hg branch default -f 

To wszystko. Nikt nie ma dodatkowej głowy przy przeglądzie. Bez dodatkowego zatwierdzenia.

+0

Wspomniałem o tym w mojej odpowiedzi: "" "Można połączyć ostatnie rzeczywiste zatwierdzenie z gałęzią funkcji z tym dodatkowym zatwierdzeniem przy użyciu --close-branch, ale należy wcześniej wiedzieć, które zatwierdzenie będzie ostatnim." "" –

+0

Ok, rozumiem. Po prostu niezupełnie rozumiem ostatnią część zdania ("ale trzeba wiedzieć ..."), więc pomyślałem, że oznacza to coś innego. Chciałbym również zauważyć, że ta metoda nie jest obsługiwana przez większość narzędzi GUI (TortoiseHG, SourceTree itp.). – tav

+0

@AndreyVlasovskikh Punktem tej odpowiedzi jest zamknięcie gałęzi w scaleniu zamiast ostatniego zatwierdzenia gałęzi operacji. – kasperd

Powiązane problemy