control - mercurial vs git




Abandonando mudanças sem excluir do histórico (6)

Primeiro de tudo, digite:

hg heads

Imagine, você tem três cabeças listadas:

changeset:   223:d1c3deae6297
user:        Your name  <[email protected]>
date:        Mon Jun 09 02:24:23 2014 +0200
summary:     commit description #3

changeset:   123:91c5402959z3
user:        Your name <[email protected]>
date:        Sat Dec 23 16:05:38 2013 +0200
summary:     commit description #2

changeset:   59:81b9804156a8
user:        Your name <[email protected]>
date:        Sat Sep 14 13:14:40 2013 +0200
summary:     commit description #1

Digamos que você queira manter a última cabeça ativa (223) e fechar o resto.

Você faria então o seguinte:

Fechar a cabeça # 59

hg up -r 59
hg ci --close-branch -m "clean up heads; approach abandoned"

Fechar a cabeça # 123

hg up -r 123
hg ci --close-branch -m "clean up heads; approach abandoned"

Confirme as mudanças

hg push

Não se esqueça de mudar para a cabeça direita no final

hg up -r 223

E você está feito.

Existe um commit que simplesmente não funcionou, então eu quero abandoná-lo sem deletá-lo da história .

Eu atualizei de uma revisão anterior e cometi, criando assim uma nova cabeça.

Eu não tenho filiais, eu não quero filiais, eu simplesmente quero simplesmente continuar com a nova cabeça exatamente como é, nada extravagante, sem fusão, sem preocupações, apenas continue esquecendo a anterior.

Não consigo descobrir como fazer isso e estou começando a acreditar que isso não pode ser feito. Tudo que eu acho é coisas sobre filiais, ou coisas sobre fusão.


As respostas de Niall e Nick estão em frente. Porque eu me vejo criando muitas cabeças pendentes, acabei escrevendo um pseudônimo para fechar as cabeças com mais facilidade. Adicionando isto ao seu .hgrc :

[alias]
behead = !REV=$($HG id -i); $HG update [email protected] -q && $HG ci --close-branch -m "Closing dead head" && $HG update $REV -q

(se você já tem uma seção [alias] , você pode anexá-la)

Agora você pode fechar uma cabeça em um único comando (e sem ter que atualizar para um changeset diferente manualmente) assim:

$ hg behead 123

Nota: o alias aproveita o fato de que os aliases do Mercurial podem ser comandos do shell . Isso significa que isso provavelmente funcionará apenas no UNIX, não no Windows.


Eu sei que você não quer trabalhar com filiais neste estágio, mas é exatamente isso que você fez. Quando você voltou para uma versão anterior e cometeu algo que funcionou, você criou uma ramificação - uma ramificação sem nome, mas uma ramificação da mesma forma.

Não há nenhum problema em apenas continuar como você é e não se preocupar em ter várias cabeças, mas se você quiser arrumar as coisas para não pegar acidentalmente a cabeça errada uma vez, então você pode matar o ramo antigo.

Há uma boa seção na documentação do Mercurial que leva você através de uma série de opções em torno de Podar Ramos Morto .

Acho que a melhor opção para você é marcar o branch antigo como "fechado". Se a sua cabeça antiga é a revisão "123" então:

hg update -r 123
hg commit --close-branch -m 'Closing old branch'
hg update -C default

Uma alternativa para fechar ou remover o ramo indesejado seria fundi- lo de uma maneira que descarta totalmente seus efeitos, mas deixa isso na história. Essa abordagem permitirá que essas alterações indesejadas se propaguem em um push - use isso apenas se esse for o efeito pretendido.

Digamos que o histórico do changeset se pareça com isto:

1-2-3-4-5-6    
       \    
        7-8-*

e são 5 e 6 que não são mais desejados.

Você consegue fazer isso:

hg up 8
hg merge -r 6 -t :local
hg commit ...

que irá criar isso:

1-2-3-4-5-6    
       \   \
        7-8-9-*

A atualização para 8 garante que você esteja trabalhando na cabeça desejada no histórico, que você deseja manter.

O -t :local instrui o hg a usar a "ferramenta" de mesclagem chamada local, que diz para ignorar as mudanças do outro ramo, isto é, o que NÃO é representado pelo estado atual da pasta de trabalho. Mais informações .

Assim, as alterações indesejadas em 5 e 6 são preservadas na história, mas não afetam nada mais recente.


Você quer usar o hg backout . Isso remove as alterações feitas pelo conjunto de alterações de qualquer conjunto de alterações filho.

Confira isso para uma boa explicação. Backout Mercurial


Atualize seu repositório para a cabeça com a revisão que você deseja esquecer, então use a opção --close-branch para hg commit para marcar essa ramificação (anônima) como fechada. Em seguida, atualize para o chefe da filial que você deseja e continue trabalhando.

Você ainda pode ver a ramificação fechada se usar a opção -c para hg heads , mas ela não será mostrada por padrão e a hg merge não saberá se fundir com a cabeça fechada.

Você precisará usar hg push --force na primeira vez que você empurrar essa cabeça fechada para outro repositório, já que na verdade você cria cabeçotes adicionais no repositório remoto quando você pressiona. Então diga ao Mercurial que está tudo bem com o --force . As pessoas que puxam a cabeça fechada não se incomodam com nenhum aviso.





mercurial