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.

Martin Buberl
fonte
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.

VonC
fonte
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).

Peter Graham
fonte
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". :)

Ry4an Brase
fonte
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

Tim Henigan
fonte
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

TmTron
fonte
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.

ITsDEv
fonte
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.

cabhishek
fonte