Como abandonar uma fusão hg?

131

Sou novo em colaborar com a Mercurial. Minha situação:

  • Outro programador alterou a rev 1 de um arquivo para substituir recuos de 4 espaços por recuo de 2 espaços. (Ou seja, alterei todas as linhas.) Ligue para a rev 2, enviada para o repositório remoto.
  • Confirmei alterações substanciais rev 1 com várias alterações de código no meu espaço de trabalho local. Chame isso de rev 3.
  • Eu hg pulled hg mergeed sem uma idéia clara do que estava acontecendo.
  • Os conflitos são inúmeros e não são realmente substantivos.

Então, eu realmente gostaria de ter mudado meu repositório local para recuos de 2 espaços antes da fusão; então a mesclagem será trivial (suponho). Mas não consigo fazer backup. Eu acho que preciso, hg update -r 3mas diz abort: outstanding uncommitted merges.

Como posso desfazer a mesclagem, alterar o espaçamento no repositório local e reaparecer?

Grumdrig
fonte

Respostas:

126

Você pode descartar alterações não confirmadas com o sinalizador -C (ou --clean):

hg update -C -r 3

CUIDADO: Tudo o que não foi cometido desaparecerá!

Depois disso, você provavelmente deve usar algum tipo de ferramenta de formatador de código para executar toda a operação ou, pelo menos, encontrar e substituir por expressões regulares. Algo tão simples como substituir o que corresponde ^____(use 4 espaços em vez de sublinhados) por __(2 espaços), repetido algumas vezes (a menos que você tenha um código aninhado insanamente) deve funcionar.

R. Martinho Fernandes
fonte
Oh - obrigada. Você deve ter respondido exatamente quando eu descobri isso sozinho. Estou no emacs, o mesmo M-x indent-regionaconteceu com o truque do reindent.
Grumdrig 03/04
6
Vale ressaltar que os arquivos não rastreados não serão removidos.
djsutho
132

BTW: se você acabou de reverter a mesclagem que fez e 3 não é o seu número de revisão, você pode fazer isso:

hg update -C -r .
matemática
fonte
24
Para alguém como eu, que no começo não entendeu como isso funciona: o ponto .é um atalho para a revisão anterior.
Jeroen Wiert Pluimers
1
Ótima resposta! deve ser melhor
Oleg Abrazhaev
1
@ Timine: De onde hg help updateeu recebo: Se nenhum conjunto de alterações for especificado, atualize para a ponta do ramo nomeado atual ... e a dica nem sempre será sua revisão atual em que você está trabalhando. Eu não testá-lo, até agora ..
matemática
1
Ah, esse é um bom detalhe para saber ... na verdade, vou excluir meu comentário, alegando que deixar de fora -r .é o mesmo #
Thymine
Simples e muito útil.
Naveen Kumar V
33

Para desfazer uma mesclagem não confirmada, use

hg update --clean

que fará o check-out de uma cópia limpa do pai de mesclagem original, perdendo todas as alterações.

Tao
fonte
2

Aparentemente, eu apenas precisava hg update -C -r 3, o que sobrescreve meus arquivos locais com a revisão em mente (que é o que eu pensava hg updateque faria; mas eu estava errado.) Obrigado pela ajuda!

Grumdrig
fonte
2
Adicionando -Cou --cleané como você diz ao Mercurial para prosseguir, mesmo quando ele joga fora alguns arquivos modificados. Você está certo de que hg update -r Xserá normalmente levá-lo para revisão X, mas quando você está em uma mala que você precisa insistir um pouco mais :-)
Martin Geisler
7
Eu acho que "hg revert --all --cancelmerge" seria muito mais intuitivo.
Warren P