2010-12-14 59 views
13

Je remarque souvent quelques changements non désirés lorsque je revois ma copie de travail (avec hg status et hg diff) juste avant un commit. Par exemple, j'ai peut-être temporairement ajouté ou supprimé du code uniquement pendant la durée d'une session de débogage.Puis-je rétablir une série de lignes dans un fichier avec mercurial?

Je sais que je peux utiliser hg revert pour supprimer les modifications indésirables, mais cela supprime tous les changements dans le fichier entier. Y a-t-il un moyen de revenir juste une partie d'un fichier?

+0

similaires: http://stackoverflow.com/questions/876763/mercurial-revert-a -single-hunk – keturn

Répondre

5

L'une des façons consiste à utiliser un outil de comparaison graphique tel que kdiff3. Si vous lui donnez le diff et choisissez "fusionner le fichier courant", vous pouvez aller ligne par ligne et choisir ce que vous voulez.

Le meilleur moyen est de s'engager plus souvent. Si vous prenez l'habitude de commettre avant d'ajouter du code de débogage, alors validez ou annulez votre code de débogage avant d'ajouter votre "vrai" code, il est très facile de supprimer votre code de débogage car il a sa propre révision. Alternativement, vous pouvez mettre votre code de débogage dans une branche distincte tout à fait.

+0

+1 J'ai suivi [ces instructions] (http://mercurial.selenic.com/wiki/KDiff3) pour activer la commande 'hg kdiff3', et j'ai trouvé le" Merge - Merge this fichier "élément de menu. Il m'a fallu un certain temps pour trouver que vous deviez faire un clic droit sur les conflits pour choisir laquelle des deux versions vous voulez sélectionner, mais cela semble fonctionner. Je vais essayer. –

+0

"Fusionner fichier actuel" était la pièce manquante du puzzle. grand merci. –

7

Je ne sais pas si vous pouvez revenir des lignes individuelles de façon explicite, mais ce que je fais dans une situation comme la vôtre est de commettre le du bon code et revenir le reste (le mauvais code). Ce flux de travail est facile en utilisant l'extension record ou crecord de Mercurial (je recommande ce dernier).

+1

J'utilise: 'hg record -m temp; hg revert -a; hg purge; hg strip -k .' pour faire exactement cela, mais aussi retourner les changements temporairement validés à la copie de travail après avoir éliminé les changements indésirables. –

3

La fenêtre "Commit" de l'interface utilisateur graphique TortoiseHg dispose d'un onglet "Sélection de groupe" qui permet de sélectionner des sections spécifiques des modifications d'un fichier à valider.

+1

..mais il ne possède pas Rever basé sur Hunk .. – user2864740

+0

@ user2864740, rétablir le fichier et valider les points que vous souhaitez conserver. –

1

J'ai une réponse différente pour votre problème, qui est le même problème que j'ai. C'est un excellent cas d'utilisation pour mercurial queues!

Quand je suis sur le point de commencer à ajouter le code de débogage à un changement que je pense est prêt, je fais ce qui suit:

hg qnew -m "fix for bug #123" fix.patch # basically a local-only commit 
hg qnew -m "debugging" dbg.patch   # prepare the next changeset at the tip 
[add my debugging] 
hg qrefresh        # update the changeset at the tip 
[...] 
hg qpop         # pop the debugging off the repo history 

Il faut un peu de temps pour s'y habituer - vous finissez par avoir à réorganisez vos patchs pour ensuite replier les corrections que vous avez faites dans le patch de travail original.

Vérifiez également l'extension du grenier de Bill Barry. Cette page explique comment l'utiliser pour quelques workflows différents et comment cela se compare à l'utilisation de mq. https://www.mercurial-scm.org/wiki/AtticExtension

4

En supposant que vous avez les record et shelve extensions activées, vous pouvez le faire comme suit:

hg record -m "garbage" # pick out and commit the change you want to revert 
hg shelve --all   # temporarily hide other changes 
hg strip tip    # remove the garbage changeset 
hg unshelve    # restore the changes you want to keep 
1

Je fais cela avec le style ncurses interactif ui hg revert -i qui vous permet de marcher et de sélectionner les pièces vous voulez détruire, soit un fichier, un morceau de diff ou ligne par ligne, comme vous le souhaitez, en fonction de la profondeur de vos changements.

Je ne sais pas si cela est une fonction standard hg ou non, vous pouvez vérifier assez facilement si le vôtre a elle:

> hg revert --help --verbose | grep -- -interactive 
-i --interactive   interactively select the changes (EXPERIMENTAL) 

Rappelez-vous simplement que les changements que vous marque (X) sera ce qui sera nuked , pas ce que tu retiens.

0

Si le commit où vous voulez le changement est par ex.ba1c841aaff4, le plus facile est d'utiliser:

hg meld -r ba1c841aaff4^ <filename> 

Maintenant, cliquez sur une flèche droite (pointant vers la droite) au milieu de revenir vos lignes, enregistrez le fichier et fermez meld. kdiff3 (ancien et non intuitif) peut être une alternative.

Side note: pour utiliser vous MELD besoin de le configurer dans notre fichier ~/.hgrc:

[extdiff] 
cmd.meld = 

[merge-tools] 
meld.args=$base $local $other