merge - Come chiudere correttamente un ramo di funzionalità in Mercurial?




branch hg-merge (5)

imho ci sono due casi per rami che sono stati dimenticati di chiudere

Caso 1: il ramo non è stato fuso in default

in questo caso aggiorno al ramo e faccio un altro commit con --close-branch, sfortunatamente questo elegge il ramo per diventare il nuovo suggerimento e quindi prima di spingerlo ad altri cloni mi assicuro che il vero suggerimento riceva altre modifiche e altri non confondermi con quello strano suggerimento.

hg up myBranch
hg commit --close-branch

Caso 2: il ramo è stato fuso in default

Questo caso non è molto diverso dal caso 1 e può essere risolto riproducendo i passaggi per il caso 1 e altri due.

in questo caso aggiorno al changeset del ramo, eseguo un altro commit con --close-branch e uniamo il nuovo changeset che diventa il tip in default. l'ultima operazione crea un nuovo suggerimento nel ramo predefinito - HOORAY!

hg up myBranch
hg commit --close-branch
hg up default
hg merge myBranch

Spero che questo aiuti i futuri lettori.

Ho finito di lavorare su feature-x feature branch. Voglio unire i risultati al ramo default e chiudere feature-x per eliminarlo nell'output dei hg branches .

Ho trovato il seguente scenario, ma ha alcuni problemi:

$ hg up default
$ hg merge feature-x
$ hg ci -m merge
$ hg up feature-x
$ hg ci -m 'Closed branch feature-x' --close-branch

Quindi il ramo feature-x (changests 40 - 41 ) è chiuso, ma c'è una nuova testata , il changeset di ramo di chiusura 44 , che sarà elencato ogni volta in hg heads :

$ hg log ...
o  44 Closed branch feature-x
|
| @  43 merge
|/|
| o  42 Changeset C
| |
o |  41 Changeset 2
| |
o |  40 Changeset 1
|/
o  39 Changeset B
|
o  38 Changeset A
|

Aggiornamento : Sembra che dalla versione 1.5 Mercurial non mostri più teste di rami chiusi nell'output delle hg heads .

È possibile chiudere un ramo unito senza lasciare un altro capo? C'è un modo più corretto per chiudere un ramo di funzionalità?

Domande correlate:


È strano che nessuno abbia ancora suggerito il modo più efficace per chiudere un branch di feature ... Puoi semplicemente combinare il merge commit con il flag --close-branch (ad esempio, commettere i file modificati e chiudere il ramo simultaneamente):

hg up feature-x
hg merge default
hg ci -m "Merge feature-x and close branch" --close-branch
hg branch default -f

Quindi, questo è tutto. Nessuna testa in più sul revgraph. Nessun impegno extra.


EDIT ouch, too late ... So leggere il tuo commento affermando che vuoi mantenere il changeset feature-x in giro, quindi l'approccio alla clonazione qui non funziona.

Lascerò ancora la risposta qui perché potrebbe aiutare gli altri.

Se vuoi eliminare completamente la "feature X", perché, ad esempio, non ha funzionato, puoi clonare. Questo è uno dei metodi spiegati nell'articolo e funziona, e parla specificamente delle teste.

Per quanto ne so tu hai questo e vuoi sbarazzarti della testa "caratteristica-x" una volta per tutte:

@    changeset:   7:00a7f69c8335
|\   tag:         tip
| |  parent:      4:31b6f976956b
| |  parent:      2:0a834fa43688
| |  summary:     merge
| |
| | o  changeset:   5:013a3e954cfd
| |/   summary:     Closed branch feature-x
| |
| o  changeset:   4:31b6f976956b
| |  summary:     Changeset2
| |
| o  changeset:   3:5cb34be9e777
| |  parent:      1:1cc843e7f4b5
| |  summary:     Changeset 1
| |
o |  changeset:   2:0a834fa43688
|/   summary:     Changeset C
|
o  changeset:   1:1cc843e7f4b5
|  summary:     Changeset B
|
o  changeset:   0:a9afb25eaede
   summary:     Changeset A

Quindi fai questo:

hg clone . ../cleanedrepo --rev 7

E avrai il seguente, e vedrai che feature-x è davvero andata:

@    changeset:   5:00a7f69c8335
|\   tag:         tip
| |  parent:      4:31b6f976956b
| |  parent:      2:0a834fa43688
| |  summary:     merge
| |
| o  changeset:   4:31b6f976956b
| |  summary:     Changeset2
| |
| o  changeset:   3:5cb34be9e777
| |  parent:      1:1cc843e7f4b5
| |  summary:     Changeset 1
| |
o |  changeset:   2:0a834fa43688
|/   summary:     Changeset C
|
o  changeset:   1:1cc843e7f4b5
|  summary:     Changeset B
|
o  changeset:   0:a9afb25eaede
   summary:     Changeset A

Potrei aver frainteso ciò che volevi, ma per favore non modificarlo, ho impiegato del tempo a riprodurre il tuo caso d'uso:)


Un modo è quello di lasciare aperte le feature feature unite (e non attive):

$ hg up default
$ hg merge feature-x
$ hg ci -m merge

$ hg heads
    (1 head)

$ hg branches
default    43:...
feature-x  41:...
    (2 branches)

$ hg branches -a
default    43:...
    (1 branch)

Un altro modo è chiudere un ramo di funzionalità prima di unire usando un commit extra:

$ hg up feature-x
$ hg ci -m 'Closed branch feature-x' --close-branch
$ hg up default
$ hg merge feature-x
$ hg ci -m merge

$ hg heads
    (1 head)

$ hg branches
default    43:...
    (1 branch)

Il primo è più semplice, ma lascia un ramo aperto. Il secondo non lascia aperte teste / rami, ma richiede un altro commit ausiliario. Si può combinare l'ultimo commit effettivo al ramo della funzione con questo commit extra usando --close-branch , ma si dovrebbe sapere in anticipo quale commit sarà l'ultimo.

Aggiornamento : da Mercurial 1.5 puoi chiudere il ramo in qualsiasi momento in modo che non appaia più nelle hg heads e nelle hg heads . L'unica cosa che potrebbe infastidirti è che tecnicamente il grafico di revisione avrà ancora una revisione in più senza childen.

Aggiornamento 2 : poiché i segnalibri Mercurial 1.8 sono diventati una caratteristica fondamentale di Mercurial. I segnalibri sono più convenienti per le diramazioni rispetto ai rami nominati. Vedi anche questa domanda:


Come fare attraverso il Source Tree

 1: Open SourceTree, click on Repository -> Checkout
 2 :Click on Create New Branch
 3: Select branch where from you want to get code for new branch 
 4: Give your branch name
 5: Push the branch  (by click on Push button)






merge mercurial branch hg-merge