Exclua todas as mudanças locais e reverta para a árvore
-
22-09-2019 - |
Pergunta
Estou usando Mercurial e entrei em uma bagunça terrível localmente, com três cabeças. Não posso pressionar e só quero excluir todas as minhas alterações e compromissos locais e começar de novo com código totalmente limpo e um histórico limpo.
Em outras palavras, quero acabar com (a) exatamente o mesmo código localmente que existe na ponta da ramificação remota e (b) nenhum histórico de nenhuma confirmação local.
Eu sei hg update -C
substitui quaisquer alterações locais. Mas como faço para excluir algum compromisso local?
Para deixar claro, não tenho interesse em preservar nenhum dos trabalhos que fiz localmente. Eu só quero a maneira mais simples de voltar a uma compra local totalmente limpa.
Solução
Quando a maneira mais simples (um novo hg clone
) não é prático, eu uso hg strip
:
% hg outgoing -l 1
% hg strip $rev # replace $rev with the revision number from outgoing
Repetir até hg outgoing
permanece quieto. Observe que hg strip $rev
oblitera $rev
e todos os seus descendentes.
Observe que você pode ter que primeiro ativar strip
Em suas configurações mercuriais.
PS: Uma abordagem ainda mais inteligente é usar o idioma RevSet e fazer:
% hg strip 'roots(outgoing())'
Outras dicas
Você deseja fazer um clone local, onde preserva apenas as mudanças que também estão presentes no repositório remoto. Usar Tortoisehg, hg log
ou semelhante a descobrir qual das suas revisões é a última revisão que você não faça (o antes da bagunça começar). Usando hg outgoing
Pode ajudar aqui - ele listará todas as alterações que você fez - escolha um número de revisão antes de qualquer um deles.
Se a revisão alvo for chamada good
e seu clone é chamado foo
, então faça:
hg clone -r good foo foo-clean
Esta será uma operação local rápida - existe Não há razão para baixar tudo de novo. o foo-clean
O clone só conterá alterações até a revisão good
. Agora você pode substituir foo-clean/.hg/hgrc
com foo/.hg/hgrc
Para preservar suas configurações de repositório local, como o caminho de push/puxar padrão.
Quando você está satisfeito que foo-clean
tem tudo o que você precisa de foo
, então simplesmente exclua foo
e renomear foo-clean
para foo
. Faça um hg pull
Para obter novos alterações do repositório remoto em seu clone e continue como normal.
Se ninguém empurrou novas mudanças para o repositório remoto, é muito simples determinar qual revisão você deseja usar good
acima de: hg id default
dirá o ID da dica no repositório remoto.
OK. Então, apenas exclua todas as coisas locais, hg init
o novo repositório local e hg pull
a última dica que você tem. Não se esqueça de hg update
depois disto.
Você pode usar
Revisão da tira HG
matar qualquer revisão e sua subárvore no seu repositório local.
https://www.mercurial-scm.org/wiki/strip
Mas não tente usá -lo para qualquer coisa que já tenha sido empurrada.
Basta excluir tudo o que você tem no sistema local e recolocar novamente o repositório remoto.
hg strip `hg out --template "{rev} {author}\n" | grep YOUR_AUTHOR_NAME | cut -d " " -f 1`
faz o truque para mim.
Ele tira todas as revisões que não são empurradas para o repositório padrão criado com o nome do seu autor.
Você também pode usar esse estilo para fazê -lo não verificar com o repositório padrão, mas com outro repositório
hg strip `hg out OTHER_REPO_ALIAS --template "{rev} {author}\n" | grep YOUR_AUTHOR_NAME | cut -d " " -f 1`
Se você estiver usando o TortoiseHG, uma maneira simples de sair de uma bagunça (pequena) é primeiro atualizar para a revisão mais recente, selecionar suas alterações e iniciar "mesclar com o local". Quando o diálogo de mesclagem aparecer, basta clicar no ícone Little '+' para revelar algumas opções extras, uma das quais é "descartar as mudanças da revisão Merge Target (outras)". Fazer isso significará que suas mudanças ainda estarão no repositório e serão empurradas, mas não terão efeito, porque elas serão descartadas na mesclagem. Se você tiver muitas mudanças que abrangem muitas cabeças, talvez não queira poluir o repositório dessa maneira, mas é uma solução simples e vale a pena considerar se as alterações que você está descartando contêm dados que você pode mais tarde fazer referência.