2012-07-23 23 views
6

Mam kilka commitów, powiedzmy A, B, C, D, i chcę zachować B, C i D, i zrobić zatwierdzenie, które jest (BCD) ⁻¹. Jaki jest najłatwiejszy sposób, jeśli mam wiele zatwierdzeń, które chcę cofnąć w tym samym czasie?Jak mogę przywrócić wiele zatwierdzeń w Mercurial?

(wydaje mi się przypomnieć widząc stackoverflow pytanie o to, że zasugerował, że hg update do A, a następnie zadzwonić hg commit z jakimiś argumentami, ale nie wydaje się znaleźć na to pytanie teraz).

Odpowiedz

1

You” ve odpowiedział na własne pytanie, zaktualizuj z powrotem do A i po prostu kontynuuj od tego. Jeśli chcesz w tym momencie zrobić nową głowę, musisz dokonać zmiany w pliku lub w innym, jak opisano tutaj: How can I force mercurial to accept an empty commit. A mail thread połączony z tym postem opisuje sposób użycia MqExtension do usunięcia BCD (chyba że je popchnąłeś):

+0

To, ale tylko jeśli D jest GŁOWĄ. Nie ma zbierania śmieci w hg, więc B, C i D nie zostaną utracone. D pozostanie HEAD, które możesz naciskać lub nie - do ciebie. – DanMan

4

Wygląda na to, że szukasz backout. Zobacz:

hg help backout 

Nie sądzę, może wycofać się z wielu zobowiązuje jednym razem, więc trzeba z powrotem je indywidualnie:

hg backout D 
hg backout C 
hg backout B 

To stworzy trzy rewizje w górnej części D, która są odwrotnością D, C i B. Jeśli chcesz połączyć te zatwierdzenia w jeden zestaw zmian, możesz je złożyć, używając rebase --collapse lub jednego z wielu innych rozszerzeń (np. histedit lub mq lub collapse rozszerzeń).

Jeśli nie chce się wycofać poszczególne zmiany, ale zrobić wszystko za jednym zamachem, można wykonać następujące czynności:

hg update A 
hg debugsetparents D 
hg commit -m "revert B-D" 

Jest brzydki, ale działa. Jednak nie rejestruje to zmian nazw w odwrotnej kolejności. Szczerze mówiąc, nie polecałbym tego, jeśli chcesz się wycofać tak bardzo, że poszczególne polecenia wycofania są zbyt trudne do napisania, to zastanawiam się, czy wycofanie się jest naprawdę tym, co powinieneś chcieć robić dla tego konkretnego walizka.

Możesz też zrobić, jak sugerują Jim i Rafael, i zdecydować, że B, C i D znajdują się w oddziale, i zaktualizować z powrotem do punktu A i kontynuować zaangażowanie (oddzielając historię w tym momencie). To może być bardziej odpowiednie.

+0

To zrobi to, co chcę (jeśli zmiażdżę trzy commits razem w mq), ale stanie się nieporęczne, jeśli jest 50 zdań, które chcę cofnąć. Szukam czegoś bliżej drugiej części zaakceptowanej odpowiedzi na http://stackoverflow.com/questions/1463340/revert-multiple-git-commits (ale dla hg), tj. Hg odpowiednika 'git zresetuj --hard A && git reset --soft @ {1} && git commit -a' –

+0

Zaktualizowałem odpowiedź w ten sposób w Mercurial. Jednak podobnie jak w przypadku odpowiedzi git, z którą się łączyłeś, nie odwraca ona zestawów zmian. Naprawdę zastanawiam się, dlaczego kiedykolwiek chciałbyś powrócić do tak dużej sekwencji zestawów zmian. Lepiej jest po prostu zaparkować je w nieaktywnym oddziale i kontynuować od wcześniejszej zmiany. Jeśli opisujesz swój przypadek użycia w pytaniu, może ci to pomóc w lepszym rozwiązaniu twojego problemu. –

+0

Możesz również rozważyć przesłanie żądania funkcji do Mercurial, aby polecenie wycofania zaakceptowało zestaw poprawek zamiast pojedynczych wersji. –

4

Najłatwiej:

Jesteś changeset D i chcesz zakończyć tej gałęzi

hg commit --close-branch -m "Branch closed" 

Teraz wystarczy udać się do changeset A i kontynuować swoją pracę zatwierdzanie nowych rzeczy

hg up -r A 
... change stuff ... 
hg ci -m "New stuff" 

Oddział, który ma B, C i D będzie tam, ale zostanie zakończony, nie będzie wyświetlany w hg heads. Będzie to gałąź nieaktywna.

To też jest łatwe i ekspresyjne. Jeśli spojrzysz na wykres, zobaczysz oddzielną gałąź, która została zamknięta, a gałąź "oficjalna" będzie działać. Znacznie lepiej niż te zestawy zmian wycofania i wycofania generujące hałas w twojej branży.

+1

Jak wyjaśniono w [innym pytaniu] (http://stackoverflow.com/questions/3688263/mercurial-beheading- a-head), gdy spróbujesz przesunąć zamkniętą głowę do innego repozytorium, otrzymasz ostrzeżenie o tworzeniu wielu głowic. Tak, użyj 'hg push --force' przy pierwszym naciśnięciu. Ludzie, którzy pociągną za zamkniętą głowę, nie otrzymają żadnych ostrzeżeń. – mernst

Powiązane problemy