2010-04-20 20 views
58

Sono un utente Git che tenta di utilizzare Mercurial.Come posso resettare --hard HEAD su Mercurial?

Ecco cosa è successo: ho fatto un hg backout su un changeset che volevo ripristinare. Questo ha creato una nuova testa, quindi hg mi ha incaricato di unirmi (torna a "default", presumo). Dopo l'unione, mi ha detto che dovevo ancora impegnarmi. Poi ho notato qualcosa che ho sbagliato quando ho risolto un conflitto nell'unione, e ho deciso che volevo avere tutto come prima dello hg backout, cioè, voglio che questa unione non vincolata vada via. Su Git questa roba non memorizzata sarebbe nell'indice e farei semplicemente un git reset --hard HEAD per cancellarlo ma, da quello che ho letto, l'indice non esiste su Mercurial. Quindi, come faccio a uscire da questo?

+0

possibile duplicato (http: // StackOverflow. it/questions/4172753/how-to-get-rid-of-some-changeset-in-hg) – binki

risposta

76

Se non hai ancora commited, e sembra che tu non hai è possibile annullare tutto il lavoro si fondono con hg update --clean.

Tuttavia, nei nuovi mercurial è disponibile un comando pratico per riunire nuovamente un singolo file: hg resolve path/to/file.ext. Dal hg help resolve:

The available actions are: ... 

4) discard your current attempt(s) at resolving conflicts and 

riavvio l'unione da zero: "File hg resolve ..." (o "-a" per tutti i file irrisolti )

+0

Scusate, sono ancora un po 'confuso: ho eseguito 'hg up -C', ma il commit" backed out "è ancora alla punta della mia branch. Ho pensato che si trattasse di un "ramo fantasma" creato con il "backout", ma l'esecuzione di 'hg branch' restituisce' default', quindi sono sul ramo principale, dopo tutto? – hsribei

+3

Puoi avere due teste con lo stesso ramo, ed è quello che hai. Sono entrambi denominati 'default'. Questa è una situazione molto normale in mercurial e ' 'hg heads' è il comando che usi per scoprirlo/capirlo. Quando hai lanciato 'hg backout' it" Configura il backedback cambia come un nuovo changeset "in modo da creare un nuovo changeset che non andrà via senza uno sforzo eroico. Quindi ora hai due teste entrambe sul ramo di default. Dopo aver 'hg unisci' (e lo ha fatto) tornerai a una testa sul ramo di default. –

+0

Wow, non lo sapevo delle teste. Grazie per averlo indicato :) – hsribei

19

Questo è vicino:

hg update --clean

+4

sì ... a volte anche quando si spostano file (da una directory a un'altra) e poi si decide di cancellare tutto, non fa la stessa cosa di 'git reset --hard' farebbe. Ergo - mercurial è stupido – Agzam

8

del Manuale Hg GitConcepts pagina spiega come eseguire molte azioni con gli utenti git in Mercurial.

Mercurial non ha alcun comportamento integrato git reset --hard. Tuttavia, l'estensione strip fornisce un comando strip che lo fa. Per utilizzare, first enable strip nel file ~/.hgrc ::

[extensions] 
strip = 

Nota: questa estensione in nuovi in ​​Mercurial-2.8. Le versioni precedenti fornivano il comando strip nello mq extension.

Ora è possibile eseguire comandi come hg strip o anche hg help strip. Per rimuovere un changeset e tutti i suoi figli, è sufficiente specificare tale changeset come argomento su hg strip. Ad esempio, per rimuovere l'ultimo commit appena effettuato (dopo aver utilizzato i comandi che hanno causato che hg rollback segnala che non esiste più alcuna transazione per il rollback), è possibile rimuovere la revisione tip. Ogni volta che si esegue questo comando, verrà rimossa un'altra revisione. Le azioni hg strip devono essere considerate irreversibili; gli utenti non familiari dovrebbero fare i backup dei loro repository prima dell'uso.

$ hg strip tip 

Ad esempio, con revsets syntax, mi indicano che voglio togliere qualunque impegna miei che danno luogo a teste in più viene mostrato quando corro hg heads. Se si specifica una revisione particolare nell'espressione seguente diversa da tip, tutto il ramo corrente che non è un antenato della revisione scelta verrà tagliato. Questo sembra più vicino al comportamento che desidero quando invio il comando git reset --hard HEAD.

$ hg strip "branch(tip) and not(ancestors(tip)::tip)" 
+2

Mercurial 2.8 e precedenti ha un'estensione '' strip'' nel caso in cui si desideri esplicitamente il comando '' hg strip''. L'uso di '' mq'' aggiunge anche una serie di altri comandi di gestione delle patch. – davidjb

8

Da git, comandi: [? Come sbarazzarsi di alcuni di modifiche in Hg]

git reset --hard  # reset to last commit  
git clean -df  # delete untracked files 

sono uguali

hg update --clean # reset to last commit 
hg purge    # delete untracked files 
+7

Anche se questo snippet di codice può risolvere la domanda, [compresa una spiegazione] (http://meta.stackexchange.com/questions/114762/explaining-entally-code-based-answers) aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro, e queste persone potrebbero non conoscere le ragioni del tuo suggerimento sul codice. –

+0

'git reset --hard' non cancella i file non tracciati. – Ruslan

+0

Non funziona per me. 'hg update --clean 18: 8e139889ff02' dice" updated 2 files ", tuttavia quando guardo il log, è ancora dove era. ** UPD **: detto ciò, ha resettato i file alla revisione. Che è solo la metà del comportamento di 'git reset --hard' però. –

Problemi correlati