Mercurial: jak zmienić ostatni commit?

Szukam counter-części git commit --amend W Mercurial, czyli sposobu na modyfikację commita, z którym moja kopia robocza jest połączona. Wymagania dla tej procedury zmiany są następujące:

  • Jeśli to możliwe, nie powinno wymagać żadnych rozszerzeń. Musi nie wymagać niestandardowych rozszerzeń , tzn. rozszerzeń, które nie są dostarczane z oficjalną instalacją Mercurial.

  • Jeśli commit to amend jest jedną głową mojej obecnej gałęzi, nie należy tworzyć nowej głowy. Jeśli commit nie jest head, może zostać utworzony nowy head.

  • Procedura powinna być bezpieczna w taki sposób, że jeśli z jakichkolwiek powodów zmiana nie powiedzie się, chcę mieć przywrócony ten sam stan kopii roboczej i repozytorium, co przed zmianą. Innymi słowy, jeśli sama zmiana może się nie udać, powinna istnieć bezpieczna procedura przywracania kopii roboczej i stanu repozytorium. Chodzi mi o "porażki", które leżą w naturze procedury nowelizacji (np. konflikty), nie do problemów związanych z systemem plików (takich jak ograniczenia dostępu, Brak możliwości zablokowania pliku do zapisu, ...)

Aktualizacja (1):

  • procedura musi być automatyczna , więc może być wykonywana przez Klienta GUI bez konieczności interakcji z użytkownikiem.

Aktualizacja (2):

  • pliki w katalogu roboczym nie mogą być dotykane (mogą być blokady systemu plików na niektórych zmodyfikowanych plikach). To szczególnie oznacza, że możliwe podejście nie może w żadnym momencie wymagać czystego katalogu roboczego.
Author: Gangnus, 2011-11-18

6 answers

Z wydaniem Mercurial 2.2 , możesz użyć opcji --amend z hg commit, aby zaktualizować ostatni commit do bieżącego katalogu roboczego

From the command line reference :

Znacznik --amend może być użyty do zmiany rodzica katalogu roboczego za pomocą nowego commita, który zawiera zmiany w rodzicu oprócz tych, które są obecnie zgłaszane przez status hg, jeśli takie istnieją. Stary commit jest przechowywany w pakiecie kopii zapasowej w .Hg / strip-backup (zobacz Hg help bundle i HG help unbundle, jak go przywrócić).

Wiadomość, użytkownik i data są pobierane z zmienionego commita, chyba że podano. Gdy wiadomość nie jest podana w wierszu poleceń, edytor otworzy się z wiadomością o zmienionym zatwierdzeniu.

Wspaniałą rzeczą jest to, że ten mechanizm jest "bezpieczny" , ponieważ opiera się na stosunkowo nowej funkcji "faz", aby zapobiec aktualizacjom, które zmieniłyby historię, która została już udostępniona poza lokalnym repozytorium.

 272
Author: Chris Phillips,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-29 14:27:16

Masz 3 opcje edycji commitów w Mercurial:

  1. hg strip --keep --rev -1 cofa ostatni (1) commit(y), więc możesz to zrobić jeszcze raz (zobacz ta odpowiedź aby uzyskać więcej informacji).

  2. Korzystanie z rozszerzenia mq , które jest dostarczane z Mercurial

  3. Nawet jeśli nie jest dostarczany z Mercurial, rozszerzenie Histedit jest warte wspomnienia

Możesz również zajrzeć na stronę Historia edycji Mercurial wiki.

Krótko mówiąc, historia edycji jest naprawdę trudna i zniechęcana . A jeśli już przesunąłeś zmiany, prawie nic nie możesz zrobić, z wyjątkiem sytuacji, gdy masz całkowitą kontrolę nad wszystkimi innymi klonami.

Nie znam komendy git commit --amend, ale AFAIK, Histedit jest tym, co wydaje się być najbliższe, ale niestety nie jest dostarczane z Mercurial. MQ jest naprawdę skomplikowany w użyciu, ale możesz z nim zrobić prawie wszystko.

 50
Author: krtek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-22 10:09:40

Odpowiednik GUI dla hg commit --amend:

To działa również z GUI TortoiseHG (używam v2.5):

Przejdź do widoku 'Commit' lub w widoku workbench wybierz pozycję 'working directory'. Przycisk "Zatwierdź" ma opcję o nazwie " Zmień bieżącą wersję "(kliknij strzałkę rozwijaną przycisku, aby ją znaleźć).

Tutaj wpisz opis obrazka

          ||
          ||
          \/

Tutaj wpisz opis obrazka

Caveat emptor :

Ta dodatkowa opcja będzie włączona tylko wtedy, gdy wersja mercurial jest co najmniej 2.2.0, a jeśli bieżąca wersja nie jest publiczna, nie jest łatką i nie ma dzieci. [...]

Kliknięcie przycisku wywoła 'commit --amend' to 'amend' the revision.

Więcej informacji o tym na kanale THG dev

 36
Author: Cristi Diaconescu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-04 11:04:08

Zakładając, że jeszcze nie propagowałeś swoich zmian, oto, co możesz zrobić.

  • Dodaj do swojego .hgrc:

    [extensions]
    mq =
    
  • W Twoim repozytorium:

    hg qimport -r0:tip
    hg qpop -a
    

    Oczywiście nie musisz zaczynać od wersji zero lub pop wszystkich łatek, ponieważ wystarczy tylko jeden pop (hg qpop) (patrz poniżej).

  • Usuń ostatni wpis w pliku .hg/patches/series, lub łaty, które Ci się nie podobają. Zmiana kolejności jest możliwa też.

  • hg qpush -a; hg qfinish -a
  • Usuń .diff Pliki (niezatwierdzone łatki), które nadal są w środku .Hg / plastry(powinny być jednym w Twoim przypadku).

Jeśli nie chcesz, aby odebrała wszystkie Twojej łatki, możesz ją edytować używając hg qimport -r0:tip (lub podobnego), a następnie edytować rzeczy i użyć hg qrefresh, aby scalić zmiany w najwyższej łatce na stosie. Czytaj hg help qrefresh.

Edytując .hg/patches/series, możesz nawet usunąć kilka łat lub zmienić kolejność niektórych. Jeśli ostatnia wersja to 99, możesz wystarczy użyć hg qimport -r98:tip; hg qpop; [edit series file]; hg qpush -a; hg qfinish -a.

Oczywiście ta procedura jest wysoce zniechęcająca i ryzykowna. Zrób kopię zapasową wszystkiego, zanim to zrobisz!

Na marginesie, robiłem to tysiące razy na prywatnych repozytoriach.

 8
Author: hochl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-18 14:15:31

Dostrajam się do tego, co napisał krtek. Dokładniej rozwiązanie 1:

Założenia:

  • popełniłeś jeden (!) changeset, ale nie pchnął go jeszcze
  • chcesz zmodyfikować ten zestaw zmian (np. dodać, usunąć lub zmienić pliki i/lub komunikat commit)

Rozwiązanie:

  • użyj hg rollback aby cofnąć ostatni commit
  • Zatwierdź ponownie z nowymi zmianami w miejscu

The rollback really coffes The last operacja. Jego sposób działania jest dość prosty: normalne operacje W HG będą dołączane tylko do plików; Obejmuje to commit. Mercurial śledzi długości plików ostatniej transakcji i dlatego może całkowicie cofnąć jeden krok, obcinając pliki z powrotem do ich starych długości.

 6
Author: Lucero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-18 13:47:33

Najnowsze wersje Mercurial zawierają rozszerzenie evolve, które dostarcza polecenie hg amend. Pozwala to na zmianę zmian bez utraty historii zmian przed poprawkami w twojej kontroli wersji.

Hg zmienić [opcja]... [Plik]...

Aliases: refresh

Połącz zestaw zmian z aktualizacjami i zastąp go nowym

Commits a new changeset incorporating both the changes to the given files
and all the changes from the current parent changeset into the repository.

See 'hg commit' for details about committing changes.

If you don't specify -m, the parent's message will be reused.

Behind the scenes, Mercurial first commits the update as a regular child
of the current parent. Then it creates a new commit on the parent's
parents with the updated contents. Then it changes the working copy parent
to this new combined changeset. Finally, the old changeset and its update
are hidden from 'hg log' (unless you use --hidden with log).

Zobacz https://www.mercurial-scm.org/doc/evolution/user-guide.html#example-3-amend-a-changeset-with-evolve{[16]dla a pełny opis rozszerzenia evolve.

 0
Author: Karl Bartel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-06 12:12:42