Como obter uma versão específica de um arquivo no Mercurial?

114

Eu sou novo no Mercurial. Simplesmente não consigo encontrar o comando certo. Tentei atualizar / finalizar a compra sem sorte. Estou usando o repositório local. obrigado

Codismo
fonte
@Omnifarious: Eu enviei uma versão estável de um arquivo. Em seguida, continuei a trabalhar no arquivo, mas logo percebi que preciso da última versão "boa". Isso pode ser feito por update em svn, mas quando tento hg update, ele diz "0 arquivos ..."
Codismo

Respostas:

153

Eu acho que você quer hg revert -r<rev> <file>(isso vai mudar o arquivo para ficar como estava na revisão dada).

djc
fonte
Sim, é exatamente o que ele quer. :-)
Omnifário
9
ou apenas hg revert <filename> se você quiser descartar suas alterações atuais e obter as últimas que foram
confirmadas
@BlackTigerX Sem a revisão, um arquivo não modificado não será revertido para nada, mesmo que não seja a versão enviada mais recentemente. Às vezes, eu uso isso para 'escolher' os arquivos entre as revisões, então isso é importante.
user2864740
83

Como o djc disse revertaltera um arquivo no local para corresponder a uma revisão anterior. Se você quiser que ele não esteja no lugar, você pode usar hg cat -r revisionid filename(substituindo o revisionid e o nome do arquivo, é claro), que irá enviar o arquivo para stdout, adequado para redirecionar para qualquer lugar que você desejar.

Ry4an Brase
fonte
4
purrrfeito, exatamente o que eu desejava.
yota,
Incrível, é sempre bom ouvir algo assim.
Ry4an Brase
24

hg revertrealmente resolve este problema. Mas acho que você está confuso sobre uma gama mais ampla de coisas do que simplesmente a resposta à sua pergunta e deseja tentar responder de forma mais completa.

hg updateé um comando de repositório completo e não funcionará em arquivos individuais. É diferente da subversão svn updatedessa forma. Se você fizer hg --help updateisso, poderá ver que este é o caso porque o comando não aceita nenhum argumento de arquivo. Ele pode ser usado para mover todo o seu repositório para um determinado instantâneo, mas não pode ser usado para fazer isso em apenas um arquivo.

Se você digitar, hg --helpverá uma lista de comandos. É uma lista bastante grande e um tanto assustadora, mas se você a ler, encontrará esta linha:

revert       restore individual files or directories to an earlier state

Agora, se você deseja apenas o último estado para fins de comparação, há outro comando no qual você pode estar interessado, e esse é hg cat. Isso permitirá que você imprima o conteúdo de um arquivo em qualquer revisão específica. Você pode então redirecionar sua saída para algum outro arquivo. Em seguida, você pode ter a versão válida anterior de seu arquivo e a versão antiga para comparar lado a lado.

A razão pela qual o Mercurial tem um updatecomando separado é que é possível fazer algo no Mercurial que é impossível no Subversion. Você pode updateir para uma versão anterior, fazer alterações e, em seguida, confirmar. Isso criará um branch. O updatecomando tem o efeito de também alterar a revisão pai do diretório de trabalho atual, bem como alterar o conteúdo de todos os arquivos nesse diretório para as versões da revisão pai.

Isso significa que revertmuda o conteúdo de um arquivo (ou mesmo de todo o repositório se você der ao comando os argumentos corretos), mas deixa a revisão pai da cópia de trabalho atual igual.

Você pode descobrir a revisão pai (ou revisões no caso de uma fusão) da cópia de trabalho atual usando o hg parentscomando.

No Subversion, as revisões são uma progressão estritamente linear. O Mercurial cria ramos rapidamente, e eles são quase tão fáceis de fundir. As revisões formam um DAG, não uma progressão estritamente linear.

Omniforme
fonte
13

Para extrair uma revisão específica de um arquivo específico, você pode fazer isso no Windows:

hg cat "<FileToBeExtractedPath>" -r 9 > "<ExtractionPath>"

Aqui, 9 é o número da revisão.

Ou melhor ainda:

hg cat "<FileToBeExtractedPath>" -r 9 -o "<ExtractionPath>"
user2173353
fonte
1

Vim aqui tentando pegar a versão anterior, então aqui está o comando exato:

hg revert -r .~1 <file>
cmcginty
fonte