Czy jest jakiś sposób na usunięcie lokalnych zatwierdzeń w Mercurial?

209

Dlatego ciągle popełniam głupi błąd w Mercurial. Często zaczynam pracę bez „ściągania hg” i „aktualizacji hg”. Kiedy próbuję wprowadzić zmiany, pojawia się błąd.

Czy istnieje sposób na usunięcie moich lokalnych zatwierdzeń, aby uniknąć tworzenia wielu nagłówków, oddziałów itp.? Chcę tylko usunąć moje lokalne zatwierdzenia, scalić moje zmiany z napiwkiem, a następnie ponownie zatwierdzić. Brzmi prosto, prawda? Nie mogę znaleźć sposobu na łatwe usunięcie lokalnych zatwierdzeń, więc mogę czysto scalić się ze wskazówką.

Znowu próbuję tylko usunąć lokalne zatwierdzenia wykonane za pomocą „hg ci”. Nie chcę modyfikować plików, przywracać itp.

użytkownik191535
źródło
Możliwe duplikaty stackoverflow.com/questions/2139165/...
N 1.1
12
To nie jest głupi błąd, to normalny przepływ pracy, gdy kilka osób jednocześnie pracuje z tym samym repozytorium.
Juozas Kontvainis

Odpowiedzi:

247

Włącz rozszerzenie „ strip ” i wpisz następujące polecenie:

hg strip #changeset# --keep

Gdzie #changeset#jest skrót dla zestawu zmian, który chcesz usunąć. Spowoduje to usunięcie wymienionego zestawu zmian, w tym zestawów zmian, które z niego pochodzą i pozostawi niezmieniony katalog roboczy . Jeśli chcesz również przywrócić wprowadzone zmiany w kodzie, usuń tę --keepopcję.

Aby uzyskać więcej informacji, sprawdź Strip Extension .

Jeśli pojawi się komunikat „nieznane polecenie”, może być konieczne włączenie go. Aby to zrobić, znajdź plik .hgrclub Mercurial.inii dodaj do niego następujące elementy:

[extensions]
strip =

Zauważ, że (jak wspomniał Juozas w swoim komentarzu) posiadanie wielu głowic jest normalnym procesem pracy w Mercurial. Nie powinieneś używać polecenia strip do walki z tym. Zamiast tego powinieneś połączyć głowę z głową przychodzącą, rozwiązać wszelkie konflikty, przetestować, a następnie pchnąć.

stripKomenda jest użyteczna, gdy naprawdę chcesz pozbyć Zestawienia zmian, które zanieczyszczają oddział. W rzeczywistości, jeśli znajdujesz się w sytuacji tego pytania i chcesz całkowicie trwale usunąć wszystkie „zmiany” zestawów zmian , sprawdź najwyższą odpowiedź , która w zasadzie sugeruje wykonanie:

hg strip 'roots(outgoing())'
Samaursa
źródło
8
@Bharath: Musisz włączyć rozszerzenie
Samaursa,
1
Od wersji Mercurial 2.8 strip jest samodzielnym rozszerzeniem, więc strip = jest w porządku. Co nowego dla Mercurial 2.8
Jen Chih-Hsuan
104

Jeśli używasz Hg Tortoise, po prostu aktywuj rozszerzenie „ strip ” w:

  1. Plik / Ustawienia / Rozszerzenia /
  2. Wybierz pasek

Następnie wybierz dolną wersję, od której chcesz rozpocząć usuwanie, wykonując tę ​​czynność right clicki wybierając:

  1. Zmień historię
  2. Rozebrać się

Takie jak to:

wprowadź opis zdjęcia tutaj

W tym przykładzie zostanie on skasowany z 19. rewizji do ostatniej zatwierdzonej wersji (22).

EliuX
źródło
2
File/Settings/Extensions/Chciałbym móc dodać więcej głosów. Dziękuję Ci bardzo!
dyatchenko
Argh! Próbowałem tego, ale wydawało się, że zrzuciło wszystkie moje zmiany, mimo że nie zaznaczyłem opcji „brak kopii zapasowej” lub „odrzuć zmiany lokalne”. Chciałem zachować te zmiany, po prostu ich nie zatwierdzać! Czy jest jakiś sposób, aby je teraz odzyskać?
Tim Tisdall,
2
Nie mogę znaleźć sposobu, aby zrobić to poprawnie, ale wydaje się, że zachowuję zawartość, którą musisz przekazać, --keepa TortoiseHg nie daje tej opcji. Więc ... musisz to zrobić w wierszu poleceń za pomocą hg strip -r . --keep.
Tim Tisdall,
3
z pomocy paska: „Wszelkie pozbawione pasów zestawy zmian są przechowywane w„ .hg / strip-backup ”jako pakiet (patrz„ pakiet pomocy HG ”i„ pomoc HG ”). Można je przywrócić, uruchamiając „hg unbundle .hg / strip-backup / BUNDLE”, gdzie BUNDLE to plik pakietu utworzony przez pasek. ”
Tim Tisdall,
W SourceTree było to również przydatne. Dzięki!
Ponomarenko Oleh
22

Współczesna odpowiedź (dotyczy tylko wersji Mercurial 2.1):

Użyj faz i zaznacz wersje, których nie chcesz udostępniać, jako tajne (prywatne). W ten sposób, kiedy naciskasz, nie zostaną wysłane.

W TortoiseHG możesz kliknąć zatwierdzenie prawym przyciskiem myszy, aby zmienić jego fazę.

Ponadto: Możesz także użyć rozszerzenia „rebase”, aby przenieść wyciągi lokalne do szefa udostępnionego repozytorium po wyciągnięciu.

Tom Leys
źródło
Prywatny == sekret teraz
Dmitrij Osinowski
15

Jak wszyscy inni wskazują, powinieneś po prostu pociągnąć, a następnie scalić głowy, ale jeśli naprawdę chcesz pozbyć się swoich zobowiązań bez żadnych narzędzi EditingHistory , możesz po prostu hg clone -rrepozytorium, aby uzyskać wszystkie zmiany oprócz tych.

To nie usuwa ich z oryginalnego repozytorium, ale tworzy nowy klon, który ich nie ma. Następnie możesz usunąć zmodyfikowane repozytorium (jeśli chcesz).

Ry4an Brase
źródło
Czy „hg klon -r” usuwa lokalne zmiany? Chcę tylko usunąć lokalne zatwierdzenia, aby wszystko było proste.
user191535
4
Nie usuwa ich ze sklonowanego repozytorium, ale tworzy nowy klon, który ich nie ma. Następnie możesz usunąć zmodyfikowane repozytorium, jeśli chcesz.
Ry4an Brase
9

Też natknąłem się na ten problem. Zrobiłem 2 commiti chciałem wycofać i usunąć oba zatwierdzenia.

$ hg rollback

Ale hg rollbackpo prostu cofa się do ostatniego zatwierdzenia, a nie 2 zatwierdzeń. W tym czasie nie zdawałem sobie z tego sprawy i zmieniłem kod.

Kiedy znalazłem, hg rollbackże właśnie wycofałem jeden zatwierdzenie, stwierdziłem, że mogę użyć hg strip #changeset#. Tak więc szukałem hg log -l 10ostatnich 10 zatwierdzeń i otrzymałem odpowiedni zestaw zmian, który chciałem strip.

$ hg log -l 10
changeset:   2499:81a7a8f7a5cd
branch:      component_engine
tag:         tip
user:        myname<[email protected]>
date:        Fri Aug 14 12:22:02 2015 +0800
summary:     get runs from sandbox

changeset:   2498:9e3e1de76127
branch:      component_engine
user:        other_user_name<[email protected]>
date:        Mon Aug 03 09:50:18 2015 +0800
summary:     Set current destination to a copy incoming exchange

......

$ hg strip 2499
abort: local changes found

Co abort: local changes foundznaczy Oznacza to, że hgznaleziono zmiany w kodzie, które nie zostały jeszcze zatwierdzone. Aby rozwiązać ten problem, należy hg diffzapisać zmieniony kod hg reverti hg strip #changeset#. Takie jak to:

$ hg diff > /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff
$ hg revert file_you_have_changed
$ hg strip #changeset#

Po wykonaniu powyższej czynności możesz utworzyć patchplik różnicowy, a kod można dodać z powrotem do projektu.

$ patch -p1 < /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff
Idąc moją drogą
źródło
9

Możesz obejść to jeszcze łatwiej dzięki rozszerzeniu Rebase , po prostu użyj, hg pull --rebasea twoje zatwierdzenia zostaną automatycznie ponownie zatwierdzone do wyciągniętej wersji, unikając problemu rozgałęziania.

za dużo php
źródło
1
Kosztem niedokładnej historii i możliwej korupcji, jeśli zrobisz coś źle.
Ry4an Brase 24.01.11
5

Jeśli znasz git, z przyjemnością skorzystasz z histedit, który działa jak git rebase -i.

neo
źródło
4

hg stripjest tym, czego szukasz. Jest to analogiczne, git resetjeśli znasz git.

Użyj konsoli:

  1. Musisz znać numer wersji. hg log -l 10. To polecenie pokazuje ostatnie 10 zatwierdzeń. Znajdź zatwierdzenie, którego szukasz. Potrzebujesz 4-cyfrowej liczby z linii zmiany zestawuchangeset: 5888:ba6205914681

  2. Potem hg strip -r 5888 --keep. Spowoduje to usunięcie rekordu zatwierdzenia, ale wszystkie pliki zostaną zmodyfikowane, a następnie można je ponownie uruchomić. (jeśli chcesz usunąć pliki, aby po prostu usunąć --keephg strip -r 5888

val.sytch
źródło
1

[Hg Tortoise 4.6.1] Jeśli jest to ostatnia akcja, możesz użyć akcji „Cofnij / Cofnij” (Ctrl + U).

HG Tortoise Image

Tomas
źródło
Dokładnie sprawdź dołączenie obrazu.
Bill Keller
0

Oprócz doskonałej odpowiedzi Samaursy, możesz użyć evolverozszerzenia prunejako bezpiecznej i możliwej do odzyskania wersji strip, która pozwoli Ci wrócić na wypadek, gdybyś zrobił coś złego.

Mam na sobie te aliasy .hgrc:

 # Prunes all draft changesets on the current repository
 reset-tree = prune -r "outgoing() and not obsolete()"
 # *STRIPS* all draft changesets on current repository. This deletes history.
 force-reset-tree = strip 'roots(outgoing())'

Zauważ, że prunerównież --keep, podobnie jak strip, zachowuje nienaruszony katalog roboczy, umożliwiając ponowne uruchomienie plików.

Euller Borges
źródło