2010-06-29 3 views
3

Hier j'ai commis un fichier, mais Mercurial dit qu'il ne peut pas annuler, car j'ai d'autres fichiers modifiés dans le projet ...Dans Mercurial, pourquoi ne pouvons-nous pas annuler un commit lorsqu'il y a d'autres fichiers modifiés?

C'est un peu étrange ... ce n'est pas un niveau atomique sur chaque fichier? Validez 1 fichier, puis 1 fichier de backout? Deuxièmement, je peux enregistrer une copie de ces fichiers modifiés A, B, C, dans des fichiers tmp, hg les rétablir, puis annuler, puis recopier ces fichiers tmp en A, B, C et isn ' t que le même que back back hg que le dernier commit, mais juste plus de travail?

Répondre

3

En général, effectuer un backout implique une fusion. Lors de la fusion, la copie de travail est utilisée comme espace de travail: les conflits de fusion apparaissent comme des changements dans les fichiers de votre travail, et vous les résolvez en éditant les fichiers dans votre copie de travail. C'est la raison pour laquelle Mercurial insiste pour que vous ayez une copie de travail propre avant de fusionner ou de reculer: il n'y a vraiment aucun autre bon endroit pour Mercurial pour stocker les fichiers quand il a besoin de vous pour résoudre les conflits.

Personnellement, je n'ai jamais rencontré ce problème. Je n'ai jamais modifié les fichiers qui traînent - je les commets ou je les cache dans un patch MQ. Si vous ne voulez pas utiliser MQ, alors un simple

hg diff > tmp 
hg revert --all 
# working directory is now clean, do your merge/backout/... 
hg import --no-commit tmp 

est suffisant pour traiter votre cas. Cela a bien sûr été enveloppé dans des commandes plus faciles par les gens sympathiques qui écrivent des extensions: voir le attic extension pour un exemple.

+0

Oui, c'est correct! – Omnifarious

2

Non. Mercurial n'est pas un outil de révision de fichier, c'est changeset-revision. Un changeset inclut tous les fichiers affectés par un changement particulier, pas les fichiers individuels. Oui, théoriquement faire revenir sur tous les fichiers ouverts, backout, puis éditer ces fichiers à nouveau aura le même effet que faire un backout du fichier individuel. Cependant, dans la pratique, l'historique du dépôt ne contient pas d'entrées séparées pour chaque fichier, donc vous ne pouvez pas annuler un seul fichier.

+0

Ce n'est pas vrai. Mercurial conserve un historique des versions distinct pour chaque fichier et utilise le manifeste pour lier toutes les versions pour un ensemble de modifications donné. La raison pour laquelle le retrait est difficile dans le cas où l'OP décrit est beaucoup plus subtile. – Omnifarious

Questions connexes