Szukam odpowiednika git commit --amend
w Mercurial, tj. Sposobu modyfikacji zatwierdzenia, z którym jest połączona moja kopia robocza. Interesuje mnie tylko ostatnie zatwierdzenie, a nie arbitralne wcześniejsze zatwierdzenie.
Wymagania dotyczące tej procedury zmiany są następujące:
jeśli to możliwe, nie powinno wymagać żadnych rozszerzeń. Nie może wymagać rozszerzeń innych niż domyślne , tzn. Rozszerzeń, które nie są dostarczane z oficjalną instalacją Mercurial.
jeśli zobowiązanie do zmiany jest jednym szefem mojego obecnego oddziału, nie należy tworzyć nowego szefa . Jeśli zatwierdzenie nie jest nagłówkiem, może zostać utworzony nowy nagłówek.
procedura powinna być bezpieczna w taki sposób, że jeśli z jakichkolwiek przyczyn zmiana się nie powiedzie, chcę przywrócić tę samą kopię roboczą i stan repozytorium jak przed zmianą. Innymi słowy, jeśli sama poprawka może się nie powieść, powinna istnieć bezpieczna procedura przywracania kopii roboczej i stanu repozytorium. Mam na myśli „awarie”, które leżą w naturze procedury zmiany (jak np. Konflikty), a nie problemy związane z systemem plików (takie jak ograniczenia dostępu, niemożność zablokowania pliku do zapisu, ... )
Aktualizacja (1):
- procedura musi być zautomatyzowana , aby mogła być wykonywana przez klienta GUI bez wymaganej interakcji użytkownika.
Aktualizacja (2):
- pliki w katalogu roboczym nie mogą być dotykane (niektóre zmodyfikowane pliki mogą blokować system plików). Oznacza to w szczególności, że możliwe podejście w żadnym momencie nie może wymagać czystego katalogu roboczego.
źródło
Masz 3 opcje edycji zatwierdzeń w Mercurial:
hg strip --keep --rev -1
cofnij ostatnie (1) zatwierdzenie (s), abyś mógł to zrobić ponownie ( więcej informacji znajdziesz w tej odpowiedzi ).Korzystanie z rozszerzenia MQ , które jest dostarczane z Mercurial
Nawet jeśli nie jest dostarczany z Mercurialem, warto wspomnieć o rozszerzeniu Histedit
Możesz także zajrzeć na stronę Historia edycji wiki Mercurial.
Krótko mówiąc, edycja historii jest naprawdę trudna i odradzana . A jeśli już wprowadziłeś zmiany, prawie nic nie możesz zrobić, z wyjątkiem sytuacji, gdy masz całkowitą kontrolę nad wszystkimi innymi klonami.
Nie znam się tak naprawdę na
git commit --amend
poleceniu, ale AFAIK, Histedit wydaje się być najbliższym podejściem, ale niestety nie jest dostarczane z Mercurialem. Korzystanie z MQ jest naprawdę skomplikowane, ale możesz z nim zrobić prawie wszystko.źródło
hg revert myfile
cofnąć usunięcie. Być może ponowne dodaniehg add
do pliku porollback
również działa.Odpowiednik GUI dla
hg commit --amend
:Działa to również z GUI TortoiseHG (używam wersji 2.5):
Przejdź do widoku „Zatwierdź” lub w widoku stołu roboczego wybierz pozycję „katalogu roboczego”. Przycisk „Zatwierdź” ma opcję „Zmień bieżącą wersję” (kliknij strzałkę przycisku, aby ją znaleźć).
Zastrzegający emptor :
Więcej informacji na ten temat na kanale deweloperskim THG
źródło
Dostrajam się do tego, co napisał Krtek. W szczególności rozwiązanie 1:
Założenia:
Rozwiązanie:
hg rollback
do cofnięcia ostatniego zatwierdzeniaWycofanie naprawdę cofa ostatnią operację. Jego sposób działania jest dość prosty: normalne operacje w HG będą dołączane tylko do plików; obejmuje to zatwierdzenie. Mercurial śledzi długości plików ostatniej transakcji, a zatem może całkowicie cofnąć się o jeden krok, skracając pliki z powrotem do ich starych długości.
źródło
Zakładając, że nie rozpowszechniłeś jeszcze swoich zmian, oto, co możesz zrobić.
Dodaj do swojego .hgrc:
W twoim repozytorium:
Oczywiście nie musisz zaczynać od zera zero lub usunąć wszystkie łatki, ponieważ wystarczy tylko jeden ostatni pop (
hg qpop
) (patrz poniżej).usuń ostatni wpis w
.hg/patches/series
pliku lub łatki, których nie lubisz. Możliwa jest również zmiana kolejności.hg qpush -a; hg qfinish -a
.diff
pliki (niezastosowane łatki) nadal znajdujące się w .hg / łatkach (powinno być w twoim przypadku).Jeśli nie chcesz , aby wziąć z powrotem wszystko z plastra, można edytować go za pomocą
hg qimport -r0:tip
(lub podobne), a następnie edytuj rzeczy i wykorzystaniehg qrefresh
do scalić zmiany do najwyższego plaster na stosie. Czytaćhg help qrefresh
.Poprzez edycję
.hg/patches/series
możesz nawet usunąć kilka łatek lub zmienić ich kolejność. Jeśli ostatnia wersja to 99, możesz po prostu użyćhg qimport -r98:tip; hg qpop; [edit series file]; hg qpush -a; hg qfinish -a
.Oczywiście ta procedura jest wysoce odradzana i ryzykowna . Zrób kopię zapasową wszystkiego, zanim to zrobisz!
Na marginesie zrobiłem to zilliony razy na repozytoriach prywatnych.
źródło
hg qfold
, btwhg import -r<prev>:tip
. Szkoda, że nie ma skrótu do poprzedniej wersji, jak w Subversion.Najnowsze wersje Mercurial zawierają
evolve
rozszerzenie, które udostępniahg amend
polecenie. Pozwala to na zmianę zatwierdzenia bez utraty historii zmian wstępnych w kontroli wersji.Zobacz https://www.mercurial-scm.org/doc/evolution/user-guide.html#example-3-amend-a-changeset-with-evolve, aby uzyskać pełny opis
evolve
rozszerzenia.źródło
Może nie rozwiąże wszystkich problemów w pierwotnym pytaniu, ale ponieważ wydaje się to de facto postem na temat tego, jak mercurial może zmienić poprzednie zatwierdzenie, dodam informacje o wartości 2 centów.
Jeśli jesteś podobny do mnie i chcesz tylko zmodyfikować poprzednią wiadomość zatwierdzenia (naprawić literówkę itp.) Bez dodawania żadnych plików, to zadziała
Bez żadnych wzorców dołączania lub wykluczania
hg commit
domyślnie uwzględniają wszystkie pliki w katalogu roboczym. Stosowanie wzoru-X 'glob:**'
wyklucza wszystkie możliwe pliki, pozwalając jedynie na modyfikację komunikatu zatwierdzenia.Funkcjonalnie jest tak samo, jak w
git commit --amend
przypadku braku plików w indeksie / etapie.źródło
Innym rozwiązaniem może być
uncommit
polecenie, aby wykluczyć określony plik z bieżącego zatwierdzenia.hg uncommit [file/directory]
Jest to bardzo pomocne, gdy chcesz zachować bieżące zatwierdzenie i
files/directories
usunąć zaznaczenie niektórych plików z zatwierdzenia (szczególnie pomocne w przypadku ich usunięcia).źródło