Usuń wszystkie lokalne zestawy zmian i wróć do drzewa

95

Używam Mercurial i wpadłem w straszny bałagan lokalnie, z trzema głowami. Nie mogę naciskać i chcę po prostu usunąć wszystkie lokalne zmiany i zatwierdzenia i zacząć od nowa z całkowicie czystym kodem i czystą historią.

Innymi słowy, chcę skończyć z (a) dokładnie tym samym kodem lokalnie, jaki istnieje na końcu zdalnej gałęzi i (b) bez historii jakichkolwiek lokalnych zatwierdzeń.

Wiem, że hg update -Cnadpisuje wszelkie lokalne zmiany. Ale jak usunąć lokalne zatwierdzenia?

Żeby było jasne, nie interesuje mnie zachowanie żadnej pracy, którą wykonałem lokalnie. Chcę tylko najprostszego sposobu na powrót do całkowicie czystego, lokalnego kasy.

Richard
źródło

Odpowiedzi:

129

Kiedy najprostszy sposób (nowy hg clone) nie jest praktyczny, używam hg strip:

% hg outgoing -l 1
% hg strip $rev # replace $rev with the revision number from outgoing

Powtarzaj, aż hg outgoingpozostanie cicho. Zauważ, że hg strip $revunicestwia $revi wszystkich jego potomków.

Pamiętaj, że może być konieczne włączenie najpierw stripw ustawieniach Mercurial .

PS: jeszcze mądrzejszym podejściem jest użycie języka revset i wykonanie:

% hg strip 'roots(outgoing())'
po prostu ktoś
źródło
1
Dziękuję Ci! Skończyło się na sytuacji, która rozwiązała się doskonale, bez najmniejszego zamieszania.
eswald,
1
To uratowało mnie przed dużymi poprawkami powyżej, bardzo proste, dziękuję!
David C
3
Jeśli ktoś ma problemy z dostaniem się hg strip 'roots(outgoing())'do pracy z powodu jej nierozpoznania 'roots(outgoing())'. Udało mi się to wykorzystać hg strip "roots(outgoing())".
jsea
@SombreErmine in cmd.exe, tak.
po prostu ktoś
21

Będziesz chciał utworzyć lokalny klon, w którym zachowasz tylko zestawy zmian, które są również obecne w zdalnym repozytorium. Zastosowanie TortoiseHg , hg loglub podobna, aby dowiedzieć się, które z wersjami Ostatnia wersja jest taka, że ty nie zrobić (jeden przed bałagan uruchomiony). Użycie hg outgoingmoże tutaj pomóc - wyświetli listę wszystkich wprowadzonych zestawów zmian - wybierz numer wersji wcześniejszy niż którykolwiek z nich.

Jeśli wywoływana jest wersja docelowa goodi wywoływany jest twój klon foo, wykonaj:

hg clone -r good foo foo-clean

Będzie to szybka, lokalna operacja - nie ma powodu, aby pobierać wszystko od nowa . foo-cleanKlon będzie zawierać tylko Zestawienia zmian do rewizji good. Teraz można zastąpić foo-clean/.hg/hgrcz foo/.hg/hgrcaby zachować swoje ustawienia repozytorium lokalne takie jak ścieżka domyślna Push / przeciwsobnym.

Kiedy upewnisz się, że foo-cleanmasz wszystko, czego potrzebujesz foo, po prostu usuń fooi zmień nazwę foo-cleanna foo. Wykonaj a, hg pullaby pobrać nowe zestawy zmian ze zdalnego repozytorium do swojego klonu i kontynuuj normalnie.


Jeśli nikt nie wypchnął nowych zestawów zmian do zdalnego repozytorium, bardzo łatwo jest określić, której wersji chcesz użyć, jak goodpowyżej: hg id defaultpoda identyfikator wskazówki w zdalnym repozytorium.

Martin Geisler
źródło
Mam taką samą sytuację, ale mam też dużo plików w katalogu repozytorium, ale są w hgignore. Nie można zainstalować paska hg i chciałbym porzucić lokalne zatwierdzenia bez zastępowania całego klonu. Jakieś pomysły? - Ach! Jeśli nie dodałem żadnych plików, powinienem móc po prostu skopiować inny klon do mojego starego katalogu !?
Peteter
Uważaj jednak na tę metodę, jeśli masz wiele gałęzi. Klonowanie do określonej wersji powoduje pobranie tylko zestawów zmian w gałęzi określonej wersji. Może być wtedy konieczne hg pull -rwykonanie ostatniej „dobrej” wersji każdej dodatkowej gałęzi.
Yitz,
9

Dobrze. Po prostu usuń wszystkie lokalne rzeczy, hg initnowe lokalne repozytorium i hg pullnajnowszą wskazówkę, którą masz. Nie zapomnij o hg updatetym po tym.

alemjerus
źródło
Dzięki. Kiedy mówisz „usuń wszystkie lokalne rzeczy”, masz na myśli usunięcie całego repozytorium, czy tylko moich zmian? Co robi hg init (wyszukałem w Google, ale nie widzę prostego wyjaśnienia) i czy muszę używać z nim żadnych flag? Czy usunie takie rzeczy, jak moje preferencje Mercurial .hgrc?
Richard
Aktualizacja: jeśli usunę wszystko w katalogu głównym projektu, wpiszę „hg init”, otrzymam „abort: repository. już istnieje!'. Czy muszę skonfigurować nowy katalog i pracować z nim? Wolałbym nie, jeśli to możliwe ... na pewno musi być prosty sposób na zabicie wszystkiego, co zrobiłem lokalnie ?!
Richard
Tak, usuń wszystko, w tym całe repozytorium. Zacznij od nowego, czystego folderu. Swoje preferencje możesz zapisać w pliku kopii zapasowej, a następnie przywrócić je do nowego repozytorium, które utworzysz za pomocą hg init reponame. Szczegóły na temat init i innych rzeczy: hgbook.red-bean.com/read/mercurial-in-daily-use.html
alemjerus
6
alemjerus: hg init+ hg pull= hg cloneRóżnica polega na tym, że hg clonetworzy ładny .hg/hgrcplik dla Ciebie i hg cloneużywa twardych linków, aby zaoszczędzić miejsce podczas klonowania na tym samym systemie plików.
Martin Geisler
Richard: Wynik hg help initjest tutaj: selenic.com/mercurial/hg.1.html#init Ale może to jest zbyt lakoniczne? Jeśli potrzebujesz dodatkowej pomocy, wyślij wiadomość e-mail na naszą listę mailingową! Zobacz: mercurial.selenic.com/wiki/MailingLists
Martin Geisler
5

Możesz użyć

wersja paska hg

zabić dowolną wersję i jej poddrzewo w lokalnym repozytorium.

https://www.mercurial-scm.org/wiki/Strip

Ale nie próbuj go używać do niczego, co już zostało wypchnięte.

averasko
źródło
Możesz go użyć w wersji publicznej, ale jeśli pociągniesz ponownie, pojawi się ponownie. (Hg strip działa tylko z lokalnym repozytorium.)
Mike Rosoft
2

Po prostu usuń wszystko, co masz w systemie lokalnym i ponownie sklonuj zdalne repozytorium.

Dz.U.
źródło
2
hg strip `hg out --template" {poprawka} {autor} \ n "| grep YOUR_AUTHOR_NAME | cut -d "" -f 1`

załatwia sprawę dla mnie.

Usuwa wszystkie wersje, które nie zostały przeniesione do domyślnego repozytorium, które są tworzone z nazwiskiem autora.

Możesz również użyć tego stylu, aby nie sprawdzał się w domyślnym repozytorium, ale w innym repozytorium

hg strip `hg out OTHER_REPO_ALIAS --template" {rev} {autor} \ n "| grep YOUR_AUTHOR_NAME | cut -d "" -f 1`
Sebastian
źródło
0

Jeśli używasz TortoiseHg, jednym prostym sposobem na wyjście z (małego) bałaganu jest najpierw zaktualizowanie do najnowszej wersji, a następnie wybranie zestawów zmian i zainicjowanie „scalenia z lokalnymi”. Kiedy pojawi się okno dialogowe scalania, wystarczy kliknąć małą ikonę „+”, aby wyświetlić dodatkowe opcje, z których jedną jest „odrzuć zestawy zmian z wersji docelowej scalania (innej)”. W ten sposób Twoje zestawy zmian będą nadal znajdować się w repozytorium i zostaną wypchnięte, ale nie przyniosą żadnego efektu, ponieważ zostaną odrzucone podczas scalania. Jeśli masz wiele zestawów zmian obejmujących wiele głów, możesz nie chcieć zanieczyszczać repozytorium w ten sposób, ale jest to prosta poprawka i warto rozważyć, czy zestawy zmian, które odrzucasz, zawierają dane, do których możesz później chcieć się odwołać.

MrFlamey
źródło