2012-08-22 12 views
9

Mi sono imbattuto in una difficoltà sul lavoro (come presentato nello schizzo semplificato di seguito). Durante la creazione di un ramo l'impostazione predefinita per qualche motivo si è bloccata come parent a un ramo, mantenendo comunque un ramo predefinito separatamente (ovvero il ramo predefinito che stiamo utilizzando andando avanti). Questo ci ha lasciato con due rami predefiniti.Bloccato con due diramazioni predefinite in Mercurial dopo il commit di diramazioni interrotte

Qualcuno ha scambiato come eseguire il commit delle modifiche prima della diramazione, quindi abbiamo finito per unire le modifiche apportate in branch1 in un ramo2.

Ho cercato Mercurial: the definitive guide per verificare se si tratta di un problema risolvibile, ma non è stato possibile scoprire quali comandi di back-out o di chiusura sarebbero stati utili. Il modo più semplice sarebbe se fosse in qualche modo possibile rinominare il ramo predefinito rimanente.

Qual è il modo migliore e/o più semplice per risolvere questo problema?

Sto preparando la fusione dei rami di sviluppo nel ramo predefinito corretto e voglio che questo problema si risolva prima di iniziare qualsiasi fusione importante che potrebbe rendere ancora più difficile la correzione in futuro.

branch problems

risposta

7

Ricordate che i nomi delle filiali sono solo etichette messi sulle commit - non c'è niente di veramente rotto circa il grafico. I nomi dei rami non influiscono su ciò che accade quando si uniscono, solo il contenuto del file è importante durante la fusione.

Detto questo, è possibile chiudere la testa in più sul default, quella sottostante branch1:

$ hg update "min(heads(branch(default)))" 
$ hg commit --close-branch -m "closing this head" 

che lascerà una stretta di modifiche penzoloni nel grafico, che va bene. Il changeset chiuso nasconderà la testa da hg heads e comandi come hg merge non suggeriranno più di fondersi con questa testa.

+0

Penso che sia stato risolto. Hai esperienza con 'hg rebase' e ​​/ o' hg strip'? Quello che sarebbe bello è avere branch1 e branch2 come un ramo. branch2 è fondamentalmente le modifiche apportate in branch1 ma senza l'inclusione del ramo predefinito. – Patrick

+0

Vedo ora, dopo aver letto la documentazione su rebase e strip, che quelli in genere vengono utilizzati solo su commit non inviati o condivisi con il repository. – Patrick

+0

@Patrick: hai ragione su rebase e strip: se hai già spostato i changeset da qualche altra parte, allora entrambi i comandi saranno inefficienti. Non si romperà nulla, ma scoprirai di avere i changeset originali quando toglierai il server. Questo nega l'effetto del comando (per 'hg strip') o sembra disordinato (per' hg rebase'). –

2

Vecchia domanda, ma per quanto possa essere utile a qualcuno.

.. questo si verifica quando diverge un singolo ramo, di solito quando qualcuno esegue uno hg push -f invece di eseguire il pull e l'aggiornamento. Nel tuo caso, la testa forzata si trova anche su un altro ramo, ma questo può accadere anche su un singolo ramo. La mia soluzione sarebbe di lasciarlo riposare fino a quando i rami non saranno unificati - almeno, se c'è un piano per unirli a un certo punto. Questa soluzione è più pulita della chiusura della testa errata, secondo me.

Tuttavia, fare hg update default ti porterà al nuovo commit con il nome 'default'. Anche se penso che questa idea sia quella giusta nel tuo caso, questo è dovuto al fatto che il "default" che in realtà vuoi è il nuovo commit con il nome di ramo "predefinito", quindi non ci dovrebbero essere problemi. Tuttavia, se la testa errata fosse più recente, hg update default porterebbe le persone alla testa errata, il che potrebbe essere abbastanza confuso.

In entrambi i casi, questo sarebbe risolvere il problema:

hg update <revision number of correct 'default' head> 
hg merge <branch the erroneous 'default' head is on> 

Quindi, in questo caso, hg update default aggiornerà alla testa erronea:

1-2(default) 
\ 
    3(default)-4(branch1) 

si avrebbe bisogno di fare:

hg update 2 
hg merge branch1 
# results in this graph: 
# 1-2---5(default) 
# \ /
# 3-4(branch1) 

mentre sotto, hg update default si aggiornerà a quello che si agisce lo vorremmo comunque:

1-2------------5(default) 
\ 
    3(default)-4(branch1) 

.. e si potrebbe semplicemente ignorare il valore predefinito errato, perché non influenzerà nessuno. ... poi, una volta che qualcuno fa un hg update default; hg merge branch1, la testa errata scomparirà silenziosamente, perché a quel punto è un antenato del "default" errato. ..che si tradurrebbe in qualcosa di simile:

1-2-5----------11(default) 
\   /
    3-4-[...]-10(branch1) 

..si potrebbe anche fare un inutile commit sul predefinita desiderata, e poi sarà il più nuovo, e sarebbe quella gente ottiene quando lo fanno hg update default, ma non mi piace davvero avere commessi spazzatura nella storia.

+0

Mi chiedevo perché avevo 2 rami predefiniti e questo ha risposto alla mia domanda. Dovevo unirmi ma non era un'opzione facile da quando ho forzato il commit, l'ho evitato e le mie modifiche sono state sovrascritte –

+0

Sì, questa situazione è quasi inevitabile a causa di qualcuno che non vuole integrarsi con il lavoro di qualcun altro. Forzare una spinta è forzare il lavoro su qualcun altro. –

Problemi correlati