2011-01-12 9 views
117

Mam kilka zmian, które wprowadziłem do mojego lokalnego repozytorium, ale jeszcze ich nie wysłałem. Ponieważ operacja trwa dłużej niż oczekiwano, chcę zamienić te zmiany na nazwaną gałąź, zanim skończę. Jak mogę to zrobić?Zmiany rtęciowe w nowym oddziale

+2

możliwy duplikat [Jak przenieść zestaw zmian do nowej gałęzi w trybie mercurial] (http://stackoverflow.com/questions/2219756/how-to-move-some-changeset-to-a-new-branch- in-mercurial) –

Odpowiedz

147

Jak sugeruje znaku towarowego, MqExtension jest jednym rozwiązaniem dla Ciebie problemem. IMHO prostszy przepływ pracy to korzystanie z rebase extension. Załóżmy, że masz historii tak:

@ changeset: 2:81b92083cb1d 
| tag:   tip 
| summary:  my new feature: edit file a 
| 
o changeset: 1:8bdc4508ac7b 
| summary:  my new feature: add file b 
| 
o changeset: 0:d554afd54164 
    summary:  initial 

Oznacza to, rewizja 0 jest podstawą, na której rozpoczął pracę na swojej funkcji. Teraz chcesz mieć wersje 1-2 na nazwanym oddziale, na przykład my-feature. Aktualizacja do rewizji 0 i utworzenia tego oddziału:

$ hg up 0 
$ hg branch my-feature 
$ hg ci -m "start new branch my-feature" 

Historia teraz wygląda tak:

@ changeset: 3:b5939750b911 
| branch:  my-feature 
| tag:   tip 
| parent:  0:d554afd54164 
| summary:  start new branch my-feature 
| 
| o changeset: 2:81b92083cb1d 
| | summary:  my new feature: edit file a 
| | 
| o changeset: 1:8bdc4508ac7b 
|/ summary:  my new feature: add file b 
| 
o changeset: 0:d554afd54164 
    summary:  initial 

użyć polecenia rebase przenieść wersje 1-2 na rewizji 3:

$ hg rebase -s 1 -d 3 

ten wyniki na następującym wykresie:

@ changeset: 3:88a90f9bbde7 
| branch:  my-feature 
| tag:   tip 
| summary:  my new feature: edit file a 
| 
o changeset: 2:38f5adf2cf4b 
| branch:  my-feature 
| summary:  my new feature: add file b 
| 
o changeset: 1:b5939750b911 
| branch:  my-feature 
| summary:  start new branch my-feature 
| 
o changeset: 0:d554afd54164 
    summary:  initial 

To wszystko .. jak wspomniano w komentarzach do odpowiedzi Marka, poruszanie się po już wypychanych zestawach zmian ogólnie jest złym pomysłem, chyba że pracujesz w małym zespole, w którym jesteś w stanie komunikować się i wymuszać manipulację historią.

+4

IMHO wadą tego rozwiązania jest wprowadzenie "atrapy" nowego atrybutu "moja gałąź" (tj. Takiego, który nie zmienia żadnych plików). – sschuberth

+7

@sschuberth: Myślę, że bycie otwartym jest dobrą rzeczą. Jeśli dodatkowy zestaw zmian jest dla ciebie problemem, połącz go z kolejnym (np. Za pomocą polecenia 'fold' z wbudowanego rozszerzenia [histedit] (http://mercurial.selenic.com/wiki/HisteditExtension)). –

+0

Jak wydrukować dziennik z drzewem ASCII? –

30

Możesz użyć MqExtension. Powiedzmy, że Zestawienia zmian przenieść są rewizje 1-3:

hg qimport -r 1:3 # convert revisions to patches 
hg qpop -a   # remove all them from history 
hg branch new  # start a new branch 
hg qpush -a   # push them all back into history 
hg qfin -a   # finalize the patches 
+0

Chcę zaimportować 63:64 i 66:68. Otrzymuję wersję 65 nie jest rodzicem 64 – Casebash

+0

Co chcesz zrobić z 65? Mq może konwertować tylko kolejne zestawy zmian z głowy. Zmienia on zwykle niezmienny zestaw zmian na zmienne łatki, które można edytować. Spowoduje to zmianę skrótów (dotyczy wszystkich dzieci), więc nie można pominąć. –

+0

Mam wiele zmian (w tym 65), które wprowadziłem na głównej gałęzi i pchnąłem – Casebash

9

wolę rozwiązanie łata opisać here Mark Tolonen

Co mam:

hg log -G 

#default branch 
@ changeset: 3:cb292fcdbde1 
| 
o changeset: 2:e746dceba503 
| 
o changeset: 1:2d50c7ab6b8f 
| 
o changeset: 0:c22be856358b 

Czego chcę:

@ changeset: 3:0e85ae268e35 
    | branch:  feature/my_feature 
    | 
    o changeset: 2:1450cb9ec349 
    | branch:  feature/my_feature 
    | 
    o changeset: 1:7b9836f25f28 
    | branch:  feature/my_feature 
    | 
/
| 
o changeset: 0:c22be856358b 

rtęciowe poleceń:

hg export -o feature.diff 1 2 3 
hg update 0 
hg branch feature/my_feature 
hg import feature.diff 

Oto stan mojego lokalnego repozytorium

@ changeset: 6:0e85ae268e35 
| branch:  feature/my_feature 
| 
o changeset: 5:1450cb9ec349 
| branch:  feature/my_feature 
| 
o changeset: 4:7b9836f25f28 
| branch:  feature/my_feature 
| 
| o changeset: 3:cb292fcdbde1 
| | 
| o changeset: 2:e746dceba503 
| | 
| o changeset: 1:2d50c7ab6b8f 
|/ 
| 
o changeset: 0:c22be856358b 

Teraz trzeba usunąć wersje 1 2 i 3 z domyślną gałęzi. Możesz to zrobić za pomocą polecenia strip z rozszerzenia mq. hg strip usuwa zestaw zmian i wszystkich jego potomków z repozytorium.

Włącz rozszerzenie, dodając następujące linie do pliku konfiguracyjnego (.hgrc lub Mercurial.ini):

vim ~/.hgrc i dodać:

[extensions] 
mq = 

A teraz rozebrać to repozytorium rewizji 1.

hg strip 1 

i jesteśmy

@ changeset: 3:0e85ae268e35 
| branch:  feature/my_feature 
| 
o changeset: 2:1450cb9ec349 
| branch:  feature/my_feature 
| 
o changeset: 1:7b9836f25f28 
| branch:  feature/my_feature 
| 
o changeset: 0:c22be856358b 

note: Zestawienia zmian są różni ale poprawki są takie same

5

Dla tych skłonny używać GUI

  1. Przejdź do Tortoise Hg ->File ->Settings następnie zaznaczyć rebase.

enter image description here

  1. żółw Restart UI

  2. Utwórz nowy oddział, gdzie można się poruszać zmian. Kliknij bieżącą nazwę oddziału -> wybierz Open a new named branch -> wybierz nazwę oddziału.

enter image description here

  1. Jeśli zmiany, które chcesz przenieść nie zostały dokonane public (np draft) iść do 5. (Jeżeli zmiany zostały już opublikowane i są nie jesteś starszym deweloperem, powinieneś porozmawiać z kimś seniorem (zdobądź kozła ofiarnego), bo możesz spieprzyć sprawę, nie biorę żadnej odpowiedzialności :)).

idź do View ->Show Console (lub Ctrl + L) następnie pisać w konsoli hg phase -f -d 2 - gdzie 2 jest najniższy rewizja będzie przeniesienie do nowego oddziału.

  1. Przejdź do gałęzi i korekta (korekta powinna być najwyższy, jeśli jesteś w ruchu zmiany nowego oddziału utworzonego w kroku 3.) Right Mouse ->Update

  2. idź do oddziału i revsion będzie przeniesienie zmian z Right Mouse ->Modify History ->Rebase

enter image description here

  1. Kliknij Rebase i módl się, aby nie było konfliktów, połącz, jeśli musisz.

  2. Przepychanie zmian, w tym momencie wszystkie poprawki powinny nadal być draft.

  3. Przejdź do najwyższej wersji w gałęzi, którą przenosisz zmiany na Right Mouse ->Change Phase to ->Public.

enter image description here

Nadzieja to zaoszczędzić trochę czasu.

+0

Świetna robota! spróbuję tego, tylko jedno pytanie - dlaczego na koniec zmienić fazę na publiczną? "Wszelkie zestawy zmian widoczne w zdalnym repozytorium są publiczne", więc czy w przypadku wypychania i tak nie będzie ono ustawione na publiczne? –

+0

@JoshLeeDucks Podczas przesuwania nie zmieniają się automatycznie na "publiczne" (przynajmniej dla mnie nie). –

Powiązane problemy