Desfazer mercurial última confirmação


125

Como posso desfazer minha última alteração acidentalmente confirmada (não pressionada) no Mercurial?

Se possível, seria preferível uma maneira de fazê-lo com o TortoiseHg.

Atualizar

No meu caso concreto, cometei um conjunto de alterações (não pressionado). Então eu puxei e atualizei do servidor. Com essas novas atualizações, decidi que meu último commit está obsoleto e não quero sincronizá-lo. Parece que hg rollbacknão é exatamente isso que estou procurando, porque reverteria a atração em vez do meu commit.


1
Que tal fazer dois hg rollbacke depois puxar novamente?
— VonC 21/01

1
A primeira reversão desfaz a atração, a segunda reversão me diz "nenhuma informação de reversão disponível".
— Martin Buberl

1
Eu encontrei a mesma situação e, tanto quanto sei, depois de fazer qualquer outra operação - você não pode voltar ou removê-la do histórico. Você precisaria clonar novamente o repositório hg.

3
strip --keep: stackoverflow.com/questions/29413851/… resolve diretamente a tarefa, assim como o MQ qimport. Como alternativa, pode ser melhor simplesmente rebaseno cenário se as alterações locais também forem mantidas e não houver conflito. (Use uma mesclagem para manter algumas alterações combinadas de ambas as ramificações quando esse for o objetivo final do gráfico desejado, especialmente em um caso não-rápido.) Também pode ser válido apenas para fechar a ramificação, que ainda 'preserva o histórico' (mas diferente de uma mesclagem), dependendo do estado final desejado.
— user2864740

2
Como @ user2864740 diz, hg strip --keepé o comando fazer uso, mas você precisa fornecer uma revisão, por exemplo: hg strip --keep -r .. Esta resposta explica bem stackoverflow.com/a/19064016/1286571
— ForeverWintr 1/16/16

Respostas:


77

Uma maneira seria hg rollback (descontinuado em Hg2.7, agosto de 2013)

Por favor, use em hg commit --amendvez de rollbackpara corrigir erros no último commit.

Reverta a última transação em um repositório.

Ao confirmar ou mesclar , o Mercurial adiciona a entrada do conjunto de alterações por último.
O Mercurial mantém um log de transações com o nome de cada arquivo tocado e seu comprimento antes da transação. Na interrupção, ele trunca cada arquivo para o seu tamanho anterior. Essa simplicidade é um benefício de tornar os revlogs apenas anexados . O diário de transações também permite uma operação de desfazer.

Consulte a seção Recuperação do TortoiseHg :

texto alternativo

Este tópico também detalha a diferença entre hg rollbacke hg strip:
(escrito por Martin Geisler, que também contribui com SO)

  • ' hg rollback' removerá a última transação. Transações são um conceito frequentemente encontrado em bancos de dados. No Mercurial, iniciamos uma transação quando determinadas operações são executadas, como confirmação, envio, recebimento ...
    Quando a operação é concluída com êxito, a transação é marcada como concluída. Se ocorrer um erro, a transação será "revertida" e o repositório será deixado no mesmo estado de antes.
    Você pode ativar manualmente uma reversão com 'hg rollback'. Isso desfará o último comando transacional. Se um comando pull trouxe 10 novos conjuntos de alterações para o repositório em diferentes ramificações, ' hg rollback' irá removê-los todos. Observe: não há backup quando você reverte uma transação!

  • ' hg strip' removerá um conjunto de alterações e todos os seus descendentes. Os conjuntos de alterações são salvos como um pacote configurável, que você pode aplicar novamente se precisar deles de volta.

ForeverWintr sugere nos comentários (em 2016, 5 anos depois)

Você pode 'cancelar a confirmação' de arquivos, primeiro hg esquecendo-os, por exemplo hg forget filea; hg commit --amend:, mas isso parece pouco intuitivo.
hg strip --keepé provavelmente uma solução melhor para hg moderna.


Quando eu entendo que a reversão correta remove a última transação. No meu caso, fiz um commit e, em seguida, puxei do servidor. Então, isso significa que eu reverteria a atração em vez de confirmar?
— Martin Buberl

1
@ Martin Buberl: De acordo com selenic.com/mercurial/hg.1.html#rollback , pull é considerado uma transação. Portanto, se você puxou, a execução hg rollbackdesfará a atração em vez da confirmação.
— Tim Henigan

2
Não sei ao certo como hg commit --amenddeve funcionar, mas, para mim, me deu um editor para modificar a mensagem de confirmação e nenhum método para alterar quais arquivos foram incluídos. Saí do editor sem salvar e descobri que minha confirmação incorreta foi alterada para incluir TODOS os arquivos alterados!
— precisa

2
Não está claro para mim como obter uma resposta para a pergunta usando hg commit --amend. Você pode 'cancelar a confirmação' dos arquivos, hg forgetselecionando-os primeiro , por exemplo:: hg forget filea; hg commit --amend, mas isso parece pouco intuitivo. hg strip --keep é provavelmente a melhor solução para os hg modernos.
— ForeverWintr 2/16/16

1
@JasonS book.mercurial-scm.org/read/... é uma boa leitura, embora no seu caso, você também pode considerar redefinição hg: stackoverflow.com/a/31302998/6309
— VonC

46

hg strip removerá completamente uma revisão (e quaisquer descendentes) do repositório.

Para usar o strip, você precisará instalar o MqExtension adicionando as seguintes linhas ao seu .hgrc (ou mercurial.ini):

[extensions]
mq =

No TortoiseHg, o comando strip está disponível no ambiente de trabalho. Clique com o botão direito do mouse em uma revisão e escolha 'Histórico de modificações' -> 'Faixa'.

Como stripaltera o histórico do repositório, você deve usá-lo apenas em revisões que ainda não foram compartilhadas com ninguém. Se você estiver usando o mercurial 2.1+, poderá usar fases para rastrear essas informações. Se um commit ainda estiver na fase de rascunho, ele não será compartilhado com outros repositórios para que você possa removê-lo com segurança. (Obrigado a Zasurus por apontar isso).


2
SE a revisão em questão ainda estiver na frase de rascunho (ou se você tiver acesso a TODOS os repositórios para os quais foi pressionado / puxado e aplicar a faixa a todos eles) (que é o caso nesta descrição), isso é sooo a melhor e mais limpa opção.
— GazB 23/07/12

4
Se você possui o TortoiseHg instalado, há uma interface gráfica para ativar o mq globalmente. Na versão atual: ative "arquivo-> configurações-> guia configurações globais-> extensões-> mq" ou acesse o arquivo de configurações através do botão "Editar arquivo".
— David

19

Como você não pode reverter, você deve mesclar esse commit na nova cabeça que recebeu quando puxou. Se você não deseja nenhum trabalho realizado, pode fazê-lo facilmente usando esta dica .

Portanto, se você puxou e atualizou a cabeça deles, pode fazer o seguinte:

hg --config ui.merge=internal:local merge

mantém todas as alterações na revisão com check-out atual e nenhuma delas na revisão sem check-out (aquela que você escreveu que não deseja mais).

Essa é uma ótima maneira de fazer isso, pois mantém seu histórico preciso e completo. Se daqui a dois anos alguém encontrar um bug no que você removeu, você pode olhar na sua implementação (não usada, mas salva) da mesma coisa e dizer "ah, eu fiz direito". :)


5

hg rollback é o que você quer.

No TortoiseHg, isso hg rollbacké realizado na caixa de diálogo de confirmação. Abra a caixa de diálogo de confirmação e selecione "Desfazer".

texto alternativo


1
Fiz um commit, depois puxei e atualize / sincronize. Com essas novas mudanças, decidi que meu último commit é obsoleto e quero desfazê-lo. O botão Desfazer no TortoiseHg está desativado no meu caso.
— Martin Buberl

A reversão agora está obsoleta.
— UpTheCreek 15/09/14

Na versão atual do Tortoise HG, você pode acessar a opção Rollback / Undo no item de menu Repository.
— Davidwc

Citação @UpTheCreek necessária.
— 21416 DanMan

@ Danman - verifique o link que ele forneceu.
— UpTheCreek

3

Na versão atual do TortoiseHg Workbench 4.4.1 (07.2018), pode utilizar Repository- Rollback/undo...:
insira a descrição da imagem aqui


1

Sua solução alternativa.

Se você não enviar para o servidor, irá clonar na nova pasta ou remover (excluir todos os arquivos) da pasta do repositório e clonar novo.


0

depois de extrair e atualizar sua área de trabalho, faça um thg e clique com o botão direito do mouse no conjunto de alterações que deseja se livrar e, em seguida, clique em modificar histórico -> faixa, ele removerá o conjunto de alterações e você apontará para a dica padrão.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.