Come abbandonare una fusione hg?


131

Sono nuovo a collaborare con Mercurial. La mia situazione:

  • Un altro programmatore ha cambiato il giro 1 di un file per sostituire i rientri di 4 spazi con il rientro di 2 spazi. (Cioè ho cambiato ogni linea.) Chiama quel rev 2, spinto al repository remoto.
  • Ho apportato modifiche sostanziali rev 1 con varie modifiche al codice nell'area di lavoro locale. Chiama quel rev 3.
  • Ho hg pulled e hg mergesenza una chiara idea di cosa stesse succedendo.
  • I conflitti sono innumerevoli e non veramente sostanziali.

Quindi vorrei davvero aver cambiato il repository locale in rientri a 2 spazi prima di unirli; allora l'unione sarà banale (suppongo). Ma non riesco a fare il backup. Penso di aver bisogno, hg update -r 3ma dice abort: outstanding uncommitted merges.

Come posso annullare l'unione, modificare la spaziatura nel mio repository locale e ricomparire?

Risposte:


126

Puoi scartare le modifiche non confermate con il flag -C (o --clean):

hg update -C -r 3

ATTENZIONE: tutto ciò che non è stato commesso sparirà!

Dopo di ciò dovresti probabilmente usare un qualche tipo di strumento di formattazione del codice per eseguire l'intera operazione, o almeno alcuni di trovare e sostituire con espressioni regolari. Qualcosa di semplice come sostituire ciò che corrisponde ^____(usa 4 spazi anziché i trattini bassi) con __(2 spazi), ripetuto alcune volte (a meno che tu non abbia follemente un codice nidificato) dovrebbe funzionare.


Oh, grazie. Devi aver risposto bene quando l'ho capito da solo. Sono in emacs, così ha M-x indent-regionfatto il trucco reindent.
Grumdrig

6
Vale la pena notare che i file non tracciati non verranno rimossi.
djsutho,

132

A proposito: se hai appena ripristinato l'unione che hai fatto e 3 non è il tuo numero di revisione puoi farlo:

hg update -C -r .

24
Per chiunque come me che all'inizio non ha capito come funziona: il punto .è una scorciatoia per la revisione precedente.
Jeroen Wiert Pluimers,

1
Bella risposta! dovrebbe essere il migliore
Oleg Abrazhaev il

1
@Thymine: From hg help updateI get: Se non viene specificato nessun changeset, esegui l' aggiornamento alla punta del ramo con nome corrente ... e la punta potrebbe non essere sempre la revisione corrente su cui stai lavorando. Finora non l'ho provato ..
matematica

1
Ah, questo è un buon dettaglio da sapere ... in realtà ho intenzione di eliminare il mio commento affermando che lasciare -r .è lo stesso
Thymine

Semplice e molto utile.
Naveen Kumar V

33

Per annullare una fusione senza commit, utilizzare

hg update --clean

che verificherà una copia pulita del genitore unione originale, perdendo tutte le modifiche.


2

Apparentemente avevo solo bisogno di hg update -C -r 3, che sovrascrive i miei file locali tenendo conto del rev (che è quello che pensavo hg updateavrebbe fatto; ma mi sbagliavo.) Grazie per il mio aiuto!


2
Aggiungendo -Co --cleanè come dici a Mercurial di andare avanti, anche quando getterà via alcuni file modificati. Hai ragione che hg update -r Xnormalmente ti porterà alla revisione X, ma quando sei in unione devi insistere un po 'di più :-)
Martin Geisler,

7
Penso che "hg revert --all --cancelmerge" sarebbe molto più intuitivo.
Warren P,
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.