Como fechar corretamente uma ramificação de recurso no Mercurial?

240

Eu terminei de trabalhar em um ramo de recursos feature-x. Quero mesclar os resultados de volta ao defaultramo e fechar feature-xpara me livrar dele na saída de hg branches.

Eu vim com o seguinte cenário, mas ele tem alguns problemas:

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

Portanto, o feature-xramo (changests 40- 41) é fechado, mas há um novo cabeçalho , o conjunto de alterações do ramo de fechamento 44, que será listado hg headssempre:

$ 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
|

Atualização : Parece que, desde a versão 1.5, o Mercurial não mostra mais cabeças de galhos fechados na saída de hg heads.

É possível fechar um ramo mesclado sem deixar mais uma cabeça? Existe uma maneira mais correta de fechar uma ramificação de recurso?

Perguntas relacionadas:

Andrey Vlasovskikh
fonte
@ Andy: mas o artigo apontado NÃO fala apenas sobre "--close-branch". Ele mostra quatro maneiras de podar sua filial. Se você realmente não quiser mais, pode clonar conforme explicado no artigo. O único "problema" é se, por qualquer motivo, você quiser fechá-lo, mas mantenha-o por perto.
SyntaxT3rr0r
1
@WizardOfOdds Sim, eu li o artigo inteiro sobre podas de galhos mortos. Quero que o ramo permaneça no histórico de revisões, não jogue fora. Anteriormente, acabei de mesclar ramos de recursos defaultsem "fechá-los". Isso resultou em 0 novas cabeças, mas essas ramificações ficaram visíveis para hg branchessempre (como ramificações inativas).
Andrey Vlasovskikh
Para desenvolver recursos, costumo clonar todo o repositório e depois mesclá-lo novamente assim que o recurso for concluído. Não gosto de ter os restos de galhos (fechados) na história.
DanMan

Respostas:

218

Uma maneira é deixar as ramificações de recursos mesclados abertas (e inativas):

$ 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)

Outra maneira é fechar uma ramificação de recurso antes de mesclar usando uma confirmação 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)

O primeiro é mais simples, mas deixa um ramo aberto. O segundo não deixa cabeças / ramos abertos, mas requer mais um commit auxiliar. É possível combinar o último commit real no ramo do recurso com esse commit extra --close-branch, mas deve-se saber antecipadamente qual o commit será o último.

Atualização : Desde Mercurial 1.5 pode fechar a filial em qualquer momento, por isso não vai aparecer em ambos hg branchese hg headsmais. A única coisa que pode incomodá-lo é que tecnicamente o gráfico de revisão ainda terá mais uma revisão sem filhos.

Atualização 2 : Desde os favoritos do Mercurial 1.8 se tornaram um recurso principal do Mercurial. Os marcadores são mais convenientes para ramificação do que as ramificações nomeadas. Veja também esta pergunta:

Andrey Vlasovskikh
fonte
2
Não é necessariamente verdade isso Bookmarks are more convenient for branching than named branches. Os marcadores Hg não são a mesma coisa que os ramos Git. Eles estão cheios de muitos casos extremos que os tornam inadequados como ramificações de recursos. Por exemplo: ao clonar um repositório, você terminará com a confirmação mais recente na defaultramificação. Se você usar indicadores, este conjunto de alterações corresponderá a um indicador aleatório (instável). Se você usar ramificações nomeadas, obterá a confirmação mais recente na ramificação estável / padrão, que geralmente é o que você deseja. Os marcadores chegarão lá um dia, mas ainda não estão lá.
Gili
Uso marcadores como tags privadas que são visíveis apenas no meu repositório local. Eles agem como lembretes dos conjuntos de alterações que preciso revisitar.
Gili
Tentei seguir esta abordagem, mas eu ainda obter um erro ao tentar push: abort: push creates new remote branches:. O que eu poderia ter feito de errado?
kasperd
79

imho existem dois casos de galhos que se esqueceram de fechar

Caso 1: a ramificação não foi mesclada com o padrão

neste caso, atualizo para o ramo e faço outro commit com --close-branch, infelizmente isso elege o ramo para se tornar a nova dica e, portanto, antes de enviá-lo para outros clones, certifico-me de que a dica real receba mais algumas alterações e outras não se confunda com essa dica estranha.

hg up myBranch
hg commit --close-branch

Caso 2: a ramificação foi mesclada com o padrão

Esse caso não é muito diferente do caso 1 e pode ser resolvido reproduzindo as etapas do caso 1 e mais duas.

Nesse caso, atualizo para o conjunto de alterações da filial, faça outra confirmação com --close-branch e mescle o novo conjunto de alterações que se tornou a dica padrão. a última operação cria uma nova dica que está na ramificação padrão - HOORAY!

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

Espero que isso ajude futuros leitores.

Nachbars Lumpi
fonte
3
Boa resposta clara para um novato do Mercurial como eu. E obrigado por não usar "ci", que não está listado como um dos comandos da hg help, então não sei o que isso significa :)
MB.
8
@MB .: nesses casos, hg help cio explicará.
Chris Morgan
Acredito que, como o comando 'hg merge' dirá, ainda há outro commit no final
Chip Grandits 02/08/19
11

EDIT ai, tarde demais ... Eu sei que li o seu comentário afirmando que você deseja manter o feature-x changeset por perto, para que a abordagem de clonagem aqui não funcione.

Ainda vou deixar a resposta aqui, pois isso pode ajudar outras pessoas.

Se você quiser se livrar completamente do "recurso X", porque, por exemplo, ele não funcionou, você pode clonar. Esse é um dos métodos explicados no artigo e funciona, e fala especificamente sobre cabeças.

Tanto quanto eu entendo, você tem isso e quer se livrar da cabeça "feature-x" de uma vez por todas:

@    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

Então você faz isso:

hg clone . ../cleanedrepo --rev 7

E você terá o seguinte e verá que o recurso x se foi:

@    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

Posso ter entendido mal o que você queria, mas, por favor, não modifique, demorei a reproduzir o seu caso de uso :)

SintaxeT3rr0r
fonte
7

É estranho que ninguém ainda tenha sugerido a maneira mais robusta de fechar uma ramificação de recursos ... Você pode combinar a consolidação de mesclagem com a flag --close-branch (ou seja, confirmar arquivos modificados e fechar a ramificação simultaneamente):

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

Então é só isso. Ninguém mais gosta de revgraph. Sem confirmação extra.

tav
fonte
Eu mencionei isso na minha resposta: "" "É possível combinar o último commit real no ramo de recursos com esse commit extra usando --close-branch, mas é necessário saber antecipadamente qual commit será o último." " "
Andrey Vlasovskikh 7/03/15
OK eu vejo. Eu simplesmente não entendo bem a última parte da frase ("mas é preciso saber ..."), então pensei que isso significa algo diferente. Também gostaria de observar que esse método não é suportado pela maioria das ferramentas da GUI (TortoiseHG, SourceTree etc.).
tav
@AndreyVlasovskikh O objetivo desta resposta é fechar a ramificação na mesclagem, e não no último commit da ramificação do recurso.
kasperd
@tav Antes de emitir o mergecomando, pode ser uma boa ideia usar hg branchpara verificar se o nome da ramificação da mesclagem é o que você deseja manter aberto.
kasperd
2
Em uma análise mais detalhada, parece que a mesclagem estará sempre no ramo fechado. O resultado desejado seria no ramo de um de seus pais e fecha o ramo de outro pai. Isso parece não ser possível. Portanto, isso não parece uma solução viável, afinal. Pena que eu realmente queria usar uma mesclagem como ponto de fechamento de um ramo.
kasperd