Mercurial annulla l'ultimo commit


125

Come posso annullare il mio ultimo cambiamento commesso accidentalmente (non spinto) in Mercurial?

Se possibile, sarebbe preferito un modo per farlo con TortoiseHg.

Aggiornare

Nel mio caso concreto ho commesso un changeset (non spinto). Quindi ho estratto e aggiornato dal server. Con questi nuovi aggiornamenti ho deciso che il mio ultimo commit è obsoleto e non voglio sincronizzarlo. Quindi sembra che hg rollbacknon sia esattamente quello che sto cercando, perché ripristinerebbe il pull invece del mio commit.


1
Che ne dici di fare due hg rollbacke poi tirare di nuovo?
VonC,

1
Il primo rollback annulla il pull, il secondo rollback mi dice "nessuna informazione di rollback disponibile".
Martin Buberl,

1
Ho riscontrato la stessa situazione e, per quanto ne so, una volta che hai fatto qualsiasi altra operazione, non puoi tornare indietro o rimuoverlo dalla cronologia. Dovresti ripetere la clonazione del repository hg.

3
strip --keep: stackoverflow.com/questions/29413851/… risolve direttamente l'attività, così come MQ qimport. In alternativa, può essere meglio semplicemente rebasenello scenario se i cambiamenti locali sono anche essere mantenuti e non c'è conflitto. (Usa un'unione per mantenere alcune modifiche combinate da entrambi i rami quando quello è l'obiettivo finale del grafico desiderato, specialmente in un caso non veloce.) Potrebbe anche essere valido solo per chiudere il ramo, che "conserva ancora la cronologia" (ma diversamente da un'unione) a seconda dello stato finale desiderato.
user2864740

2
Come @ user2864740 dice, hg strip --keepè il comando fare uso, ma è necessario fornire una revisione, per esempio: hg strip --keep -r .. Questa risposta spiega bene stackoverflow.com/a/19064016/1286571
ForeverWintr

Risposte:


77

Un modo sarebbe hg rollback (obsoleto a partire da Hg2.7, agosto 2013)

Si prega di utilizzare hg commit --amendinvece di rollbackcorreggere gli errori nell'ultimo commit.

Ripristina l'ultima transazione in un repository.

Quando si esegue il commit o l' unione , Mercurial aggiunge l' ultima voce del changeset .
Mercurial tiene un registro delle transazioni con il nome di ciascun file toccato e la sua lunghezza prima della transazione. All'interruzione, tronca ogni file alla sua lunghezza precedente. Questa semplicità è uno dei vantaggi della creazione di revlog solo in append. Il journal delle transazioni consente anche un'operazione di annullamento.

Vedi la sezione TortoiseHg Recovery :

testo alternativo

Questo thread descrive anche la differenza tra hg rollbacke hg strip:
(scritto da Martin Geisler che contribuisce anche su SO)

  • ' hg rollback' rimuoverà l'ultima transazione. Le transazioni sono un concetto che si trova spesso nei database. In Mercurial iniziamo una transazione quando vengono eseguite determinate operazioni, come commit, push, pull ...
    Al termine dell'operazione, la transazione viene contrassegnata come completa. Se si verifica un errore, la transazione viene "ripristinata" e il repository viene lasciato nello stesso stato di prima.
    È possibile attivare manualmente un rollback con "hg rollback". Questo annullerà l'ultimo comando transazionale. Se un comando pull ha portato 10 nuovi changeset nel repository su diversi rami, allora ' hg rollback' li rimuoverà tutti. Nota: non è disponibile alcun backup quando si esegue il rollback di una transazione!

  • 'hg strip ' rimuoverà un changeset e tutti i suoi discendenti. I changeset vengono salvati come un bundle, che è possibile applicare nuovamente in caso di necessità.

ForeverWintr suggerisce nei commenti (nel 2016, 5 anni dopo)

Puoi "annullare il commit" dei file dimenticandoli prima, ad esempio hg forget filea; hg commit --amend:, ma ciò non sembra intuitivo.
hg strip --keepè probabilmente una soluzione migliore per hg moderno.


Quando capisco che corretto il rollback rimuove l'ultima transazione. Nel mio caso ho fatto un commit, quindi ho estratto dal server. Quindi, ciò significa che avrei eseguito il rollback del pull anziché il commit?
Martin Buberl,

1
@Martin Buberl: Secondo selenic.com/mercurial/hg.1.html#rollback , pull è considerato una transazione. Quindi, se hai eseguito hg rollbackil pull , l'esecuzione annullerà il pull anziché il commit.
Tim Henigan,

2
Non sono sicuro di come hg commit --amenddovrebbe funzionare, ma per me mi ha dato un editor per modificare il messaggio di commit e nessun metodo per cambiare i file inclusi. Sono uscito dall'editor senza salvare e ho scoperto che il mio commit errato è stato modificato per includere TUTTI i file modificati!
Tim Tisdall,

2
Non mi è chiaro come ottenere una risposta alla domanda usando hg commit --amend. Puoi "annullare il commit" dei file hg forgetinserendoli prima , ad esempio hg forget filea; hg commit --amend:, ma ciò non sembra intuitivo. hg strip - keep è probabilmente una soluzione migliore per hg moderno.
ForeverWintr,

1
@JasonS book.mercurial-scm.org/read/... è una buona lettura, anche se nel suo caso, si potrebbe anche prendere in considerazione di reset hg: stackoverflow.com/a/31302998/6309
VonC

46

hg strip rimuoverà completamente una revisione (e tutti i discendenti) dal repository.

Per usare strip dovrai installare MqExtension aggiungendo le seguenti righe al tuo .hgrc (o mercurial.ini):

[extensions]
mq =

In TortoiseHg il comando strip è disponibile nel workbench. Fai clic con il tasto destro su una revisione e scegli "Modifica cronologia" -> "Rimuovi".

Dato che stripcambia la cronologia del repository, dovresti usarla solo su revisioni che non sono ancora state condivise con nessuno. Se si utilizza mercurial 2.1+, è possibile utilizzare le fasi per tenere traccia di queste informazioni. Se un commit è ancora in fase di bozza, non è stato condiviso con altri repository in modo da poterlo eliminare in modo sicuro. (Grazie a Zasurus per averlo sottolineato).


2
SE la revisione in questione è ancora nella bozza della frase (o hai accesso a TUTTI i repository in cui è stato eseguito il push / pull e applica la striscia a tutti) (che è il caso in questa descrizione), allora questo è quindi l'opzione migliore e più pulita.
GazB,

4
Se hai installato TortoiseHg, c'è un'interfaccia grafica per l'attivazione globale di mq. Nella versione corrente: abilitare "file-> impostazioni-> scheda impostazioni globali-> estensioni-> mq" o accedere al file delle impostazioni tramite il pulsante "Modifica file".
David,

19

Dato che non puoi eseguire il rollback, dovresti unire quel commit nella nuova testa che hai quando hai tirato. Se non vuoi il lavoro che hai svolto, puoi farlo facilmente usando questo suggerimento .

Quindi se hai tirato e aggiornato alla loro testa puoi farlo:

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

mantiene tutte le modifiche nella revisione attualmente estratta e nessuna delle modifiche nella revisione non estratta (quella che hai scritto che non desideri più).

Questo è un ottimo modo per farlo perché mantiene la cronologia accurata e completa. Se tra 2 anni qualcuno trova un bug in quello che hai rimosso puoi guardare nella tua (non utilizzata ma salvata) implementazione della stessa cosa e dire "oh, l'ho fatto bene". :)


5

hg rollback è quello che vuoi.

In TortoiseHg, hg rollbackviene eseguito nella finestra di dialogo di commit. Apri la finestra di dialogo di commit e seleziona "Annulla".

testo alternativo


1
Ho fatto un commit, quindi un pull e un aggiornamento / sincronizzazione. Con queste nuove modifiche ho deciso che il mio ultimo commit è obsoleto e voglio annullarlo. Il pulsante Annulla in TortoiseHg è disabilitato nel mio caso.
Martin Buberl,

Il rollback è ora obsoleto.
UpTheCreek,

Nella versione corrente di Tortoise HG è possibile accedere all'opzione Rollback / Undo dalla voce di menu Repository.
daveywc,

@UpTheCreek citazione necessaria.
DanMan,

@DanMan - controlla il link che ha fornito.
UpTheCreek,

3

Nell'attuale versione di TortoiseHg Workbench 4.4.1 (07.2018) è possibile utilizzare Repository- Rollback/undo...:
inserisci qui la descrizione dell'immagine


1

È una soluzione alternativa.

Se non si esegue il push sul server, si clonerà nella nuova cartella altrimenti il ​​lavaggio (eliminerà tutti i file) dalla cartella del repository e si clonerà nuovo.


0

dopo aver estratto e aggiornato l'area di lavoro, fai un thg e fai clic con il pulsante destro del mouse sul set di modifiche che desideri eliminare, quindi fai clic su modifica cronologia -> rimuovi, rimuoverà il set di modifiche e punterai al suggerimento predefinito.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.