amend git - Mercurial:come modificare l'ultimo commit?




remove tag (6)

Le versioni recenti di Mercurial includono l'estensione evolve che fornisce il comando hg amend . Ciò consente di modificare un commit senza perdere la cronologia precedente la modifica nel controllo della versione.

hg modifica [OPTION] ... [FILE] ...

alias: aggiornamento

combinare un changeset con gli aggiornamenti e sostituirlo con uno nuovo

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).

Vedi https://www.mercurial-scm.org/doc/evolution/user-guide.html#example-3-amend-a-changeset-with-evolve per una descrizione completa dell'estensione evolve .

Sto cercando una contro-parte di git commit --amend in Mercurial, cioè un modo per modificare il commit a cui è collegata la mia copia di lavoro. I requisiti per questa procedura di modifica sono:

  • se possibile, non dovrebbe richiedere alcuna estensione. Non deve richiedere estensioni non di default , ovvero estensioni che non sono accompagnate da un'installazione ufficiale Mercurial.

  • se il commit di emendare è un capo del mio attuale ramo, non dovrebbe essere creata una nuova testa . Se il commit non è testa, può essere creata una nuova testa.

  • la procedura dovrebbe essere sicura in modo tale che, se per qualsiasi motivo l'emendamento fallisce, voglio che la stessa copia di lavoro e lo stato del repository vengano ripristinati come prima dell'emendamento. Con altre parole, se la modifica stessa può fallire, dovrebbe esserci una procedura fail-safe per ripristinare la copia di lavoro e lo stato del repository. Mi riferisco ai "fallimenti" che si trovano nella natura della procedura di modifica (come ad esempio i conflitti), non ai problemi relativi al file system (come le restrizioni di accesso, non essendo in grado di bloccare un file per scrivere, ... )

Aggiornamento (1):

  • la procedura deve essere automatizzabile , quindi può essere eseguita da un client della GUI senza che sia necessaria alcuna interazione da parte dell'utente.

Aggiornamento (2):

  • i file nella directory di lavoro non devono essere toccati (potrebbero esserci blocchi del file system su determinati file modificati). Ciò significa in particolare che un possibile approccio non può mai richiedere una directory di lavoro pulita.

Hai 3 opzioni per modificare i commit in Mercurial:

  1. hg strip --keep --rev -1 Annulla l'ultimo (1) commit (s), quindi puoi farlo di nuovo (vedi questa risposta per maggiori informazioni).

  2. Utilizzando l' estensione MQ , fornita con Mercurial

  3. Anche se non è spedito con Mercurial, vale la pena menzionare l'estensione Histedit

Puoi anche dare un'occhiata alla pagina Storia di modifica del wiki Mercurial.

In breve, la cronologia dell'editing è davvero difficile e scoraggiata . E se hai già spinto le tue modifiche, non c'è quasi nulla che puoi fare, tranne se hai il controllo totale di tutti gli altri cloni.

Non ho molta familiarità con il comando git commit --amend , ma AFAIK, Histedit è quello che sembra l'approccio più vicino, ma purtroppo non viene fornito con Mercurial. MQ è davvero complicato da usare, ma puoi farne praticamente qualsiasi cosa.


Con il rilascio di Mercurial 2.2 , è possibile utilizzare l'opzione --amend con hg commit per aggiornare l'ultimo commit con la directory di lavoro corrente

Dal riferimento della riga di comando :

Il flag --amend può essere utilizzato per modificare il parent della directory di lavoro con un nuovo commit che contiene le modifiche nel genitore oltre a quelle attualmente segnalate dallo stato di hg, se ce ne sono. Il vecchio commit è memorizzato in un bundle di backup in .hg / strip-backup (vedi hg help bundle e hg help unbundle su come ripristinarlo).

Messaggio, utente e data sono presi dal commit modificato, salvo diversamente specificato. Quando un messaggio non viene specificato sulla riga di comando, l'editor si aprirà con il messaggio del commit modificato.

Il bello è che questo meccanismo è "sicuro", perché si affida alla relativamente nuova funzione "Fasi" per impedire aggiornamenti che cambierebbero la storia che è già stata resa disponibile al di fuori del repository locale.


Equivalente della GUI per hg commit --amend :

Funziona anche dalla GUI di TortoiseHG (sto usando la v2.5):

Passare alla vista 'Commit' o, nella vista del workbench, selezionare la voce 'directory di lavoro'. Il pulsante "Conferma" ha un'opzione chiamata "Modifica revisione corrente" (fai clic sulla freccia del menu a discesa del pulsante per trovarla).

          ||
          ||
          \/

Caveat emptor :

Questa opzione extra sarà abilitata solo se la versione mercurial è almeno 2.2.0 e se la revisione corrente non è pubblica, non è una patch e non ha figli. [...]

Cliccando sul pulsante chiamerai 'commit --amend' per 'modificare' la revisione.

Maggiori informazioni su questo sul canale dev THG


Mi sto sintonizzando su ciò che ha scritto krtek. Più specificamente soluzione 1:

ipotesi:

  • hai commesso uno (!) changeset ma non l'hai ancora fatto
  • vuoi modificare questo changeset (ad esempio aggiungi, rimuovi o cambia file e / o il messaggio di commit)

Soluzione:

  • usa hg rollback per annullare l'ultimo commit
  • impegnarsi di nuovo con i nuovi cambiamenti in atto

Il rollback annulla davvero l'ultima operazione. Il suo modo di lavorare è abbastanza semplice: le normali operazioni in HG si aggiungeranno solo ai file; questo include un commit. Mercurial tiene traccia delle lunghezze del file dell'ultima transazione e può quindi annullare completamente un passaggio troncando i file alle vecchie lunghezze.


hg up -C

Questo rimuoverà tutte le modifiche e aggiornerà all'ultima testa nel ramo corrente.

E puoi attivare l' estensione di eliminazione per poter rimuovere anche tutti i file non verificati.





mercurial commit amend mercurial-commit