Então, continuo cometendo um erro bobo no Mercurial. Muitas vezes, começarei a trabalhar sem fazer um "hg pull" e uma "hg update". Quando tento enviar minhas alterações, recebo um erro.
Existe alguma maneira de excluir meus commits locais para evitar a criação de várias cabeças, ramificações etc.? Eu só quero excluir minhas confirmações locais, mesclar minhas alterações com a dica e, em seguida, confirmar novamente. Parece simples, certo? Não consigo encontrar nenhuma maneira de excluir facilmente confirmações locais, para que eu possa mesclar-me com a dica.
Mais uma vez, estou apenas tentando excluir confirmações locais feitas com "hg ci". Não quero modificar arquivos, reverter etc.
Respostas:
Ative o " extensão " strip " e digite o seguinte:
Onde
#changeset#
está o hash do conjunto de alterações que você deseja remover. Isso removerá o referido conjunto de alterações, incluindo conjuntos de alterações que descendem dele e deixará seu diretório de trabalho intocado . Se você deseja também reverter suas alterações de código confirmadas, remova a--keep
opçãoPara mais informações, consulte o Extensão tira .
Se você receber "comando desconhecido 'strip'", pode ser necessário ativá-lo. Para fazer isso, localize o arquivo
.hgrc
ouMercurial.ini
e adicione o seguinte:Observe que (como Juozas mencionou em seu comentário) ter várias cabeças é um fluxo de trabalho normal no Mercurial. Você não deve usar o comando strip para combater isso. Em vez disso, você deve mesclar sua cabeça com a cabeça de entrada, resolver quaisquer conflitos, testar e pressionar.
O
strip
comando é útil quando você realmente deseja se livrar de conjuntos de alterações que poluem a ramificação. De fato, se você está na situação desta pergunta e deseja remover completamente todos os conjuntos de alterações "rascunhos" permanentemente, confira a resposta principal , que basicamente sugere:fonte
strip =
bem. WhatsNew para Mercurial 2.8Se você estiver usando o Hg Tortoise, ative a extensão " strip " em:
Em seguida, selecione a revisão inferior de onde você deseja iniciar a distribuição, fazendo
right click
isso e selecionando:Bem assim:
Neste exemplo, ele será apagado da 19ª revisão para a última realizada (22).
fonte
File/Settings/Extensions/
Eu gostaria de poder adicionar mais votos. Muito obrigado!--keep
e o TortoiseHg não oferece essa opção. Então ... você precisa fazer isso na linha de comandohg strip -r . --keep
.Resposta moderna (relevante apenas após o Mercurial 2.1):
Use Fases e marque as revisões que você não deseja compartilhar como secretas (privadas). Dessa forma, quando você pressiona, eles não serão enviados.
No TortoiseHG, você pode clicar com o botão direito do mouse em uma confirmação para alterar sua fase.
Além disso: você também pode usar a extensão "rebase" para mover suas confirmações locais para a cabeça do repositório compartilhado depois de puxar.
fonte
Como todo mundo está apontando, você provavelmente deve puxar e mesclar as cabeças, mas se você realmente deseja se livrar de seus commits sem nenhuma das ferramentas EditingHistory , pode simplesmente
hg clone -r
o repo para obter todas as alterações, exceto essas.Isso não os exclui do repositório original, mas cria um novo clone que não os possui. Em seguida, você pode excluir o repo modificado (se desejar).
fonte
Me deparei com esse problema também. Eu fiz 2
commit
e queria reverter e excluir os dois commits.Mas
hg rollback
apenas reverte para o último commit, não os 2 commit. Naquela época, eu não percebi isso e mudei o código.Quando descobri que
hg rollback
havia recuperado um commit, descobri que poderia usarhg strip #changeset#
. Então, eu costumavahg log -l 10
encontrar as 10 confirmações mais recentes e obter o conjunto de alterações correto que queriastrip
.O que
abort: local changes found
significa isso ? Isso significa que foramhg
encontradas alterações no código que ainda não foram confirmadas. Portanto, para resolver isso,hg diff
salve o código que você alterou ehg revert
ehg strip #changeset#
. Bem assim:Depois de fazer o acima, você pode
patch
o arquivo diff e seu código pode ser adicionado novamente ao seu projeto.fonte
Você pode contornar isso ainda mais facilmente com a extensão Rebase , basta usar
hg pull --rebase
e seus commits são automaticamente confirmados novamente para a revisão extraída, evitando o problema de ramificação.fonte
Se você está familiarizado com o git, ficará feliz em usar o histedit que funciona assim
git rebase -i
.fonte
hg strip
é o que você está procurando. É análogogit reset
se você estiver familiarizado com o git.Usar console:
Você precisa saber o número da revisão.
hg log -l 10
. Este comando mostra os últimos 10 confirmados. Encontre o commit que você está procurando. Você precisa de um número de 4 dígitos da linha changesetchangeset: 5888:ba6205914681
Então
hg strip -r 5888 --keep
. Isso remove o registro da confirmação, mas mantém todos os arquivos modificados e você pode confirmá-los novamente. (se você deseja excluir arquivos para remover --keephg strip -r 5888
fonte
[Hg Tortoise 4.6.1] Se for uma ação recente, você pode usar a ação "Reverter / Desfazer" (Ctrl + U).
fonte
Além da excelente resposta de Samaursa, você pode usar as
evolve
extensõesprune
como uma versão segura e recuperávelstrip
que permitirá que você volte no caso de fazer algo errado.Eu tenho esses alias no meu
.hgrc
:Note-se que
prune
também tem--keep
, assim comostrip
, para manter o diretório de trabalho intacta permitindo-lhe comprometer os arquivos.fonte