2014-07-23 11 views
5

Ho creato vari rami che ho chiuso mentre conducevano verso il nulla. Uno di questi rami è chiamato v2. È stato chiuso in passato.riavviare un ramo chiuso crea due teste, come spingerlo?

Durante lo sviluppo ulteriore, ho creato un altro ramo chiamato anche v2. Tortoise Hg mi ha avvertito che questo ramo esiste già e se mi piacerebbe "restart it" o "commit to current branch". Ho chiesto di riavviarlo.

Più dev accade su v2 (diversi commit) e ho deciso di spingere per un repository remoto che ha già il mio progetto (tra cui il già chiuso v2). Allora ottengo il messaggio

abort: push creates new remote head fce4441f5150 on branch 'v2'! 
hint: merge or see "hg help push" for details about pushing new heads 

non voglio davvero a fondersi (suppongo che il messaggio significa "fondere il vecchio con il nuovo v2v2") come questi rami non hanno molto in comune. Ho chiuso v2 invece di lasciarlo sospeso perché non mi aspettavo di usarlo più. (il self whipping sul riutilizzo dei nomi viene più tardi nella domanda, non ci si preoccupa)

Questo mi lascia con nuove teste. hg outgoing mi mostra quello che mi aspettavo per accadere ...

# this is the first commit for the new v2 

changeset: 221:ba47b76010ef 
branch:  v2 
user:  w <[email protected]> 
date:  Fri Jul 18 14:42:08 2014 +0200 
summary:  New version: all frames are subclasses, frames are organiz 

# some more commits for the new v2 

# last commit for the new v2 

changeset: 225:fce4441f5150 
branch:  v2 
tag:   tip 
user:  w <[email protected]> 
date:  Wed Jul 23 13:17:19 2014 +0200 
summary:  added manualstart.sh 

... ma v2 (quello vecchio, chiuso) è già presente nel repository:

enter image description here

Dove devo andare da adesso?

  • Devo forzare la creazione di una nuova testina sul repository remoto? Non mi piace il parametro --force in quanto mi è costato un sacco di maledizioni in passato. Voglio assicurarmi che stia bene questa volta.
  • o qualcos'altro?

Nel complesso ho appreso che non è una buona cosa riutilizzare i rami precedentemente chiusi, è corretto? O è OK a condizione che prenda alcune precauzioni?

risposta

4

Hai ragione, che non è una buona cosa riutilizzare i nomi dei rami.

Vedo due modi per ottenere ciò di cui hai bisogno, nessuno di questi è davvero "bello".

1) C'è l'opzione -f che hai già menzionato. Se avete paura di spingere più teste, prova a spingere in passi:

hg push -r <close commit of old branch> 
hg push -r <parent of 221> 
hg push -f -r 221 --new-branch 
hg push 

2) L'altra opzione sarebbe quella di fare un no-op-merge dal vecchio al nuovo ramo.

hg update -C 221 
hg merge v2 
hg revert -a -r 221 
hg commit -m "old is marked as commited" 

Ma essere consapevoli che questo potrebbe causare problemi con unioni future, perché tutti i cambiamenti che sono nella vecchia v2 sono contrassegnati come fusi, anche se provenissero da rami laterali o simili.

+0

Grazie. Non ho paura di forzare la spinta, l'ho usata una sola volta senza capire veramente cosa stavo facendo e ha incasinato il mio repository. Volevo solo assicurarmi che avere due teste non fosse una cosa disastrosa (lo ho comunque localmente). E sì - non voglio riutilizzare i nomi in futuro :) – WoJ

1

Per riferimento futuro, un'altra opzione è rimuovere completamente il vecchio ramo dal repository. In questo modo è possibile spingere il nuovo ramo senza problemi.

hg strip <start of old branch> 

Questa è una grande opzione se il vecchio ramo non è stata fusa in nulla. L'unico aspetto negativo è che hai eseguito il comando su tutti i cloni.