2010-01-21 8 views
87

Je suis nouveau à Mercurial. Juste ne peut pas trouver la bonne commande. Testé mise à jour/checkout avec pas de chance. J'utilise le référentiel local. MerciComment obtenir une version spécifique d'un fichier dans Mercurial?

+0

Que voulez-vous dire par 'version spéciale'? Avez-vous une version particulière? Qu'est-ce que vous essayez d'accomplir exactement en obtenant une version spéciale? – Omnifarious

+0

@Omnifarious: J'ai commis une version stable d'un fichier. Puis j'ai continué à travailler sur le fichier mais j'ai vite compris que j'avais besoin de la dernière version "bonne". Cela peut être fait en mettant à jour svn mais quand j'essaye la mise à jour de hg, il indique "0 dossiers ..." – Codism

Répondre

125

Je pense que vous voulez hg revert -r<rev> <file> (cela va changer ce fichier pour être comme il était à la révision donnée).

+0

Yep, c'est exactement ce qu'il veut. :-) – Omnifarious

+9

ou juste hg revenir si vous voulez annuler vos modifications actuelles, et obtenir la dernière qui a été commise – BlackTigerX

+0

@BlackTigerX Sans la révision d'un fichier non-modifié ne sera pas rétabli à quoi que ce soit, même si ce n'est pas le plus version récemment engagée. Je l'utilise parfois pour sélectionner des fichiers entre les révisions, ce qui est important. – user2864740

73

Comme dit djc revert modifie un fichier en place pour correspondre à une révision antérieure. Si vous ne le souhaitez pas, vous pouvez utiliser hg cat -r revisionid filename (en substituant revisionid et filename bien sûr) qui affichera le fichier sur stdout, pour rediriger n'importe quel endroit.

+3

purrrfect, exactement ce que je souhaitais. – yota

+0

Génial, c'est toujours agréable d'entendre quelque chose comme ça. –

23

hg revert résout effectivement ce problème. Mais je pense que vous êtes confus au sujet d'un éventail plus large de choses que simplement la réponse à votre question et que vous voulez essayer de répondre plus complètement.

hg update est une commande entière de référentiel et ne fonctionnera pas sur des fichiers individuels. Il est différent de la subversion svn update de cette manière. Si vous faites hg --help update vous pouvez voir que c'est le cas parce que la commande ne prend aucun argument de fichier. Il peut être utilisé pour déplacer l'intégralité de votre référentiel vers un instantané particulier, mais ne peut pas être utilisé pour le faire avec un seul fichier.

Si vous tapez hg --help, vous voyez une liste de commandes. Il est une liste assez grande et un peu intimidant, mais si vous lisez, vous trouverez cette ligne:

revert  restore individual files or directories to an earlier state 

Maintenant, si vous voulez juste le dernier état à des fins de comparaison, il y a une autre commande que vous soyez intéressé par, et c'est hg cat. Cela vous permettra d'imprimer le contenu d'un fichier à n'importe quelle révision particulière. Vous pouvez ensuite rediriger sa sortie dans un autre fichier. Ensuite, vous pouvez avoir la bonne version précédente connue de votre fichier et l'ancienne version à comparer côte à côte.

La raison pour laquelle Mercurial a une commande séparée update est qu'il est possible de faire quelque chose dans Mercurial qui est impossible dans Subversion. Vous pouvez update à une version antérieure, apporter des modifications, puis valider. Cela va créer une branche. La commande update a également pour effet de modifier la révision parente du répertoire de travail en cours et de modifier le contenu de tous les fichiers de ce répertoire en versions de révision. Cela signifie que revert modifie le contenu d'un fichier (ou même l'ensemble du référentiel si vous lui donnez les bons arguments) mais laisse la même révision à la version parente de la copie de travail courante.

Vous pouvez connaître la révision parente (ou les révisions dans le cas d'une fusion) de la copie de travail en cours à l'aide de la commande hg parents.

Dans Subversion, les révisions sont une progression strictement linéaire. Mercurial crée des branches à la baisse d'un chapeau, et ils sont presque aussi faciles à fusionner. Les révisions forment un DAG, pas une progression strictement linéaire.

9

Pour extraire une révision spécifique d'un fichier spécifique, vous pouvez le faire sous Windows:

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

Ici, 9 est le numéro de révision.

Ou encore mieux:

hg cat "<FileToBeExtractedPath>" -r 9 -o "<ExtractionPath>" 
Questions connexes