Estou usando o Mercurial localmente para um projeto (é o único repositório que não há como pressionar / puxar para / de qualquer outro lugar).
Até o momento, tem uma história linear. No entanto, a coisa atual em que estou trabalhando agora é uma péssima abordagem e quero voltar à versão antes de iniciá-la e implementá-la de uma maneira diferente.
Estou um pouco confuso com os comandos branch
/ revert
/ update -C
no Mercurial. Basicamente, quero reverter para a versão 38 (atualmente em 45) e ter meus próximos commits 38 como pai e continuar a partir daí. Não me importo se as revisões 39-45 são perdidas para sempre ou acabam em um ramo sem saída próprio.
Qual comando / conjunto de comandos eu preciso?
Respostas:
Se posteriormente você confirmar, criará efetivamente uma nova ramificação. Em seguida, você poderá continuar trabalhando apenas neste ramo ou, eventualmente, mesclar o existente.
fonte
Aqui está a folha de dicas sobre os comandos:
hg update
altera sua revisão pai da cópia de trabalho e também altera o conteúdo do arquivo para corresponder a essa nova revisão pai. Isso significa que novas confirmações continuarão com a revisão para a qual você atualiza.hg revert
altera apenas o conteúdo do arquivo e deixa a revisão pai da cópia de trabalho em paz. Você geralmente usahg revert
quando decide que não deseja manter as alterações não feitas que você fez em um arquivo em sua cópia de trabalho.hg branch
inicia uma nova ramificação nomeada. Pense em uma ramificação nomeada como um rótulo que você atribui aos conjuntos de alterações. Portanto, se o fizerhg branch red
, os seguintes conjuntos de alterações serão marcados como pertencentes ao ramo "vermelho". Essa pode ser uma boa maneira de organizar conjuntos de mudanças, especialmente quando pessoas diferentes trabalham em ramificações diferentes e você deseja ver mais tarde de onde se originou um conjunto de mudanças. Mas você não quer usá-lo na sua situação.Se você usar
hg update --rev 38
, os conjuntos de alterações 39 a 45 serão deixados como um beco sem saída - uma cabeça pendente como a chamamos. Você receberá um aviso ao pressionar, pois estará criando "várias cabeças" no repositório para o qual você pressiona. O aviso está lá, já que é meio indelicado deixar essas cabeças por aí, pois sugerem que alguém precisa fazer uma fusão. Mas no seu caso, você pode simplesmente seguir em frente ehg push --force
já que realmente deseja deixá-lo em espera.Se você ainda não colocou a revisão 39-45 em outro lugar, mantenha-a em sigilo. É muito simples:
hg clone --rev 38 foo foo-38
você receberá um novo clone local que contém apenas a revisão 38. Você pode continuar trabalhandofoo-38
e enviar os novos (bons) conjuntos de alterações criados. Você ainda terá as revisões antigas (ruins) no seufoo
clone. (Você é livre para renomear os clones da maneira que desejar, por exemplo,foo
parafoo-bad
efoo-38
parafoo
.)Por fim, você também pode usar
hg revert --all --rev 38
e confirmar. Isso criará uma revisão 46 que parece idêntica à revisão 38. Você continuará trabalhando a partir da revisão 46. Isso não criará uma bifurcação no histórico da mesma maneira explícita quehg update
fez, mas, por outro lado, você não se queixará de ter cabeças múltiplas. Eu usariahg revert
se estivesse colaborando com outras pessoas que já fizeram seu próprio trabalho com base na revisão 45. Caso contrário,hg update
é mais explícito.fonte
Acabei de encontrar um caso de necessidade de reverter apenas um arquivo para a revisão anterior, logo após ter feito o commit e o push. A sintaxe abreviada para especificar essas revisões não é coberta pelas outras respostas, então aqui está o comando para fazer isso
Isso
-2
reverterá para a versão antes da última confirmação, usando-1
apenas reverterá as alterações não confirmadas atuais.fonte
hg revert path/to/file -r478
IMHO,
hg strip -r 39
combina melhor com este caso.Ele requer que a extensão mq seja ativada e tem as mesmas limitações do "método de repo de clonagem" recomendado por Martin Geisler: Se o conjunto de alterações foi publicado de alguma forma, (provavelmente) retornará ao seu repo em algum momento porque você mudou apenas seu repo local.
fonte
Após o uso
hg update -r REV
, não ficou claro na resposta sobre como confirmar essa alteração para que você possa fazer o push.Se você apenas tentar confirmar após a atualização, o Mercurial não acha que há alterações.
Eu tive que primeiro fazer uma alteração em qualquer arquivo (digamos em um README) para que o Mercurial reconhecesse que eu fiz uma nova alteração, então eu poderia confirmar isso.
Isso então criou duas cabeças, como mencionado.
Para me livrar da outra cabeça antes de pressionar, segui a etapa Sem fusões para resolver essa situação.
Eu fui capaz de empurrar.
fonte
commit --close-branch
no ramo antigo. Você também podepush -f
empurrar novas cabeças, mas isso pode causar confusão quanto à atual.As respostas acima foram muito úteis e eu aprendi muito. No entanto, para minhas necessidades, a resposta sucinta é:
Onde
${1}
é o número da revisão ou o nome da ramificação. Na verdade, essas duas linhas fazem parte de um script bash, mas funcionam bem por conta própria, se você quiser fazê-lo manualmente.Isso é útil se você precisar adicionar um hotfix a uma ramificação de lançamento, mas precisar construir a partir do padrão (até obtermos nossas ferramentas de CI corretas e capazes de construir a partir de ramificações e posteriormente acabar com as ramificações de liberação).
fonte
Eu instalaria o Tortoise Hg (uma GUI gratuita para o Mercurial) e usaria isso. Você pode clicar com o botão direito do mouse em uma revisão à qual deseja retornar - com todas as mensagens de confirmação na frente dos seus olhos - e em 'Reverter todos os arquivos'. Torna intuitivo e fácil reverter para frente e para trás entre as versões de um conjunto de arquivos, o que pode ser realmente útil se você deseja estabelecer quando um problema apareceu pela primeira vez.
fonte