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.
Odpowiedzi:
Włącz rozszerzenie „ strip ” i wpisz następujące polecenie:
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ę--keep
opcję.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
.hgrc
lubMercurial.ini
i dodaj do niego następujące elementy: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ąć.
strip
Komenda 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:źródło
strip =
jest w porządku. Co nowego dla Mercurial 2.8Jeśli używasz Hg Tortoise, po prostu aktywuj rozszerzenie „ strip ” w:
Następnie wybierz dolną wersję, od której chcesz rozpocząć usuwanie, wykonując tę czynność
right click
i wybierając:Takie jak to:
W tym przykładzie zostanie on skasowany z 19. rewizji do ostatniej zatwierdzonej wersji (22).
źródło
File/Settings/Extensions/
Chciałbym móc dodać więcej głosów. Dziękuję Ci bardzo!--keep
a TortoiseHg nie daje tej opcji. Więc ... musisz to zrobić w wierszu poleceń za pomocąhg strip -r . --keep
.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.
źródło
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 -r
repozytorium, 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).
źródło
Też natknąłem się na ten problem. Zrobiłem 2
commit
i chciałem wycofać i usunąć oba zatwierdzenia.Ale
hg rollback
po 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łemhg log -l 10
ostatnich 10 zatwierdzeń i otrzymałem odpowiedni zestaw zmian, który chciałemstrip
.Co
abort: local changes found
znaczy Oznacza to, żehg
znaleziono zmiany w kodzie, które nie zostały jeszcze zatwierdzone. Aby rozwiązać ten problem, należyhg diff
zapisać zmieniony kodhg revert
ihg strip #changeset#
. Takie jak to:Po wykonaniu powyższej czynności możesz utworzyć
patch
plik różnicowy, a kod można dodać z powrotem do projektu.źródło
Możesz obejść to jeszcze łatwiej dzięki rozszerzeniu Rebase , po prostu użyj,
hg pull --rebase
a twoje zatwierdzenia zostaną automatycznie ponownie zatwierdzone do wyciągniętej wersji, unikając problemu rozgałęziania.źródło
Jeśli znasz git, z przyjemnością skorzystasz z histedit, który działa jak
git rebase -i
.źródło
hg strip
jest tym, czego szukasz. Jest to analogiczne,git reset
jeśli znasz git.Użyj konsoli:
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
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
źródło
[Hg Tortoise 4.6.1] Jeśli jest to ostatnia akcja, możesz użyć akcji „Cofnij / Cofnij” (Ctrl + U).
źródło
Oprócz doskonałej odpowiedzi Samaursy, możesz użyć
evolve
rozszerzeniaprune
jako bezpiecznej i możliwej do odzyskania wersjistrip
, która pozwoli Ci wrócić na wypadek, gdybyś zrobił coś złego.Mam na sobie te aliasy
.hgrc
:Zauważ, że
prune
również--keep
, podobnie jakstrip
, zachowuje nienaruszony katalog roboczy, umożliwiając ponowne uruchomienie plików.źródło