Mercurial cofa ostatnie zatwierdzenie

125

Jak mogę cofnąć moją ostatnią przypadkowo zatwierdzoną (nie wprowadzoną) zmianę w Mercurial?

Jeśli to możliwe, preferowany byłby sposób zrobienia tego z TortoiseHg.

Aktualizacja

W moim konkretnym przypadku dokonałem zestawu zmian (nie popchnąłem). Następnie ściągnąłem i zaktualizowałem z serwera. Dzięki tym nowym aktualizacjom zdecydowałem, że moje ostatnie zatwierdzenie jest przestarzałe i nie chcę go synchronizować. Wydaje się więc, że hg rollbacknie jest to dokładnie to, czego szukam, ponieważ wycofałoby pull zamiast mojego zatwierdzenia.

Martin Buberl
źródło
1
A co z zrobieniem dwóch hg rollback, a potem ponownym pociągnięciem?
VonC,
1
Pierwsze wycofanie cofa wyciąganie, drugie wycofanie mówi mi „brak dostępnych informacji o wycofaniu”.
Martin Buberl
1
Spotkałem się z taką samą sytuacją i o ile wiem, że po wykonaniu jakiejkolwiek innej operacji - nie można jej cofnąć ani usunąć z historii. Będziesz musiał ponownie sklonować repozytorium hg.
3
strip --keep: stackoverflow.com/questions/29413851/ ... bezpośrednio rozwiązuje zadanie, podobnie jak qimport MQ. Alternatywnie, może być lepiej po prostu rebasew scenariuszu, jeśli lokalne zmiany mają być również zachowane i nie ma konfliktu. (Użyj scalenia, aby zachować pewne połączone zmiany z obu gałęzi, gdy jest to pożądany końcowy cel wykresu, szczególnie w przypadku, gdy nie jest to fastforward.) Może być również poprawne po prostu do zamknięcia gałęzi, która nadal „zachowuje historię” (ale inaczej niż scalanie) w zależności od pożądanego stanu końcowego.
user2864740
2
Jak mówi @ user2864740, hg strip --keepto polecenie jest używane, ale musisz podać wersję, np hg strip --keep -r .. : . Ta odpowiedź dobrze wyjaśnia stackoverflow.com/a/19064016/1286571
ForeverWintr

Odpowiedzi:

77

Byłby jeden sposób hg rollback (przestarzałe od Hg2.7, sierpień 2013)

Użyj hg commit --amendzamiast, rollbackaby poprawić błędy w ostatnim zatwierdzeniu.

Wycofaj ostatnią transakcję w repozytorium.

Kiedy popełnienia lub łączenie , Mercurial dodaje changeset ostatniego wpisu.
Mercurial przechowuje dziennik transakcji zawierający nazwę każdego dotkniętego pliku i jego długość przed transakcją. Po przerwaniu skraca każdy plik do jego wcześniejszej długości. Ta prostota jest jedną z korzyści wynikających z tworzenia revlogów tylko do dołączania. Dziennik transakcji umożliwia również cofnięcie operacji.

Zobacz sekcję Odzyskiwanie TortoiseHg :

tekst alternatywny

W tym wątku opisano również różnicę między hg rollbacki hg strip:
(napisany przez Martina Geislera, który również współpracuje przy SO)

  • hg rollback” usunie ostatnią transakcję. Transakcje to pojęcie często spotykane w bazach danych. W Mercurial rozpoczynamy transakcję po wykonaniu pewnych operacji, takich jak zatwierdzenie, wypchnięcie, ściągnięcie ...
    Gdy operacja zakończy się pomyślnie, transakcja jest oznaczana jako zakończona. Jeśli wystąpi błąd, transakcja jest „wycofywana”, a repozytorium pozostaje w takim samym stanie jak poprzednio.
    Możesz ręcznie wywołać wycofywanie za pomocą „hg rollback”. Spowoduje to cofnięcie ostatniego polecenia transakcyjnego. Jeśli polecenie ściągnięcia przyniosło 10 nowych zestawów zmian do repozytorium w różnych gałęziach, wtedy „ hg rollback” usunie je wszystkie. Uwaga: podczas wycofywania transakcji nie ma kopii zapasowej !

  • ' hg strip' usunie zbiór zmian i wszystkie jego elementy podrzędne. Zestawy zmian są zapisywane jako pakiet, który możesz zastosować ponownie, jeśli będziesz ich potrzebować.

ForeverWintr sugeruje w komentarzach (w 2016 roku, 5 lat później)

Możesz „cofnąć zatwierdzenie” plików, zapominając o nich najpierw przez hg, np .: hg forget filea; hg commit --amend, ale to wydaje się nieintuicyjne.
hg strip --keepjest prawdopodobnie lepszym rozwiązaniem dla nowoczesnego HG.

VonC
źródło
Kiedy zrozumiem, że poprawię, wycofanie usuwa ostatnią transakcję. W moim przypadku wykonałem commit, a potem ściągnąłem z serwera. Czy to oznacza, że ​​wycofałbym pull zamiast zatwierdzenia?
Martin Buberl
1
@Martin Buberl: Według selenic.com/mercurial/hg.1.html#rollback pull jest traktowany jako transakcja. Więc jeśli ciągnąłeś, wykonanie hg rollbackspowoduje cofnięcie ściągnięcia zamiast zatwierdzenia.
Tim Henigan,
2
Nie jestem pewien, jak hg commit --amendma działać, ale dla mnie dał mi to edytor do zmodyfikowania komunikatu o zatwierdzeniu i żadnej metody zmiany dołączonych plików. Wyszedłem z edytora bez zapisywania i stwierdziłem, że moje błędne zatwierdzenie zostało zmienione na WSZYSTKIE zmienione pliki!
Tim Tisdall
2
Nie jest dla mnie jasne, jak uzyskać odpowiedź na pytanie za pomocą hg commit --amend. Możesz „cofnąć zatwierdzenie” plików, najpierw zapisując hg forgetje, np .: hg forget filea; hg commit --amend, ale wydaje się to nieintuicyjne. hg strip --keep jest prawdopodobnie lepszym rozwiązaniem dla nowoczesnego hg.
ForeverWintr
1
@JasonS book.mercurial-scm.org/read/… to dobra lektura, chociaż w twoim przypadku możesz również rozważyć resetowanie hg: stackoverflow.com/a/31302998/6309
VonC
46

hg strip całkowicie usunie wersję (i wszelkie elementy potomne) z repozytorium.

Aby użyć stripa, musisz zainstalować MqExtension , dodając następujące wiersze do swojego .hgrc (lub mercurial.ini):

[extensions]
mq =

W TortoiseHg polecenie strip jest dostępne w środowisku roboczym. Kliknij wersję prawym przyciskiem myszy i wybierz „Modyfikuj historię” -> „Usuń”.

Ponieważ stripzmienia historię repozytorium, powinieneś używać go tylko w przypadku wersji, które nie zostały jeszcze nikomu udostępnione. Jeśli używasz Mercurial 2.1+, możesz śledzić te informacje za pomocą faz . Jeśli zatwierdzenie jest nadal w fazie roboczej, nie zostało udostępnione innym repozytoriom, więc możesz je bezpiecznie usunąć. (Dzięki Zasurus za wskazanie tego).

Peter Graham
źródło
2
JEŚLI dana wersja nadal znajduje się w frazie roboczej (lub masz dostęp do WSZYSTKICH repozytoriów, do których została wypchnięta / wyciągnięta i zastosujesz pasek do nich wszystkich) (co ma miejsce w tym opisie), to jest to więc najlepsza i najczystsza opcja.
GazB
4
Jeśli masz zainstalowany TortoiseHg, istnieje graficzny interfejs do globalnej aktywacji mq. W obecnej wersji: włącz "plik-> ustawienia-> zakładka ustawień globalnych-> rozszerzenia-> mq" lub uzyskaj dostęp do pliku ustawień poprzez przycisk "Edytuj plik".
David
19

Ponieważ nie możesz wycofać, powinieneś scalić to zatwierdzenie z nową głową, którą otrzymałeś, kiedy pociągnąłeś. Jeśli nie chcesz żadnej pracy, którą wykonałeś, możesz to łatwo zrobić, korzystając z tej wskazówki .

Więc jeśli wyciągnąłeś i zaktualizowałeś ich głowę, możesz to zrobić:

hg --config ui.merge=internal:local merge

zachowuje wszystkie zmiany w aktualnie wyewidencjonowanej wersji i żadną ze zmian w niewypisanej wersji (tę, którą napisałeś, że już nie potrzebujesz).

To świetny sposób, aby to zrobić, ponieważ zapewnia dokładność i kompletność historii. Jeśli za 2 lata ktoś znajdzie błąd w tym, co ściągnąłeś, możesz zajrzeć do swojej (nieużywanej, ale zapisanej) implementacji tej samej rzeczy i powiedzieć „och, zrobiłem to dobrze”. :)

Ry4an Brase
źródło
5

hg rollback jest tym, czego chcesz.

W TortoiseHg hg rollbackdokonuje się tego w oknie dialogowym zatwierdzenia. Otwórz okno dialogowe zatwierdzenia i wybierz „Cofnij”.

tekst alternatywny

Tim Henigan
źródło
1
Zrobiłem zatwierdzenie, a następnie ściągnięcie i aktualizacja / synchronizacja. Po tych nowych zmianach zdecydowałem, że moje ostatnie zatwierdzenie jest przestarzałe i chcę je cofnąć. Przycisk Cofnij w TortoiseHg jest w moim przypadku wyłączony.
Martin Buberl
Wycofywanie jest teraz przestarzałe.
UpTheCreek
W aktualnej wersji Tortoise HG można przejść do opcji Przywróć / Cofnij z pozycji menu Repozytorium.
daveywc
Wymagane cytowanie @UpTheCreek.
DanMan,
@DanMan - sprawdź podany przez niego link.
UpTheCreek
3

W aktualnej wersji TortoiseHg Workbench 4.4.1 (07.2018) można użyć Repository- Rollback/undo...:
wprowadź opis obrazu tutaj

TmTron
źródło
1

Jego obejście.

Jeśli nie wyślesz na serwer, sklonujesz do nowego folderu, w przeciwnym razie wyczyścisz (usuniesz wszystkie pliki) z folderu repozytorium i sklonujesz nowy.

ITsDEv
źródło
0

po ściągnięciu i zaktualizowaniu obszaru roboczego zrób thg i kliknij prawym przyciskiem myszy zbiór zmian, którego chcesz się pozbyć, a następnie kliknij modyfikuj historię -> pasek, usunie to zestaw zmian i wskażesz domyślną wskazówkę.

cabhishek
źródło