views:

828

answers:

2

How do I revert a single hunk in Mercurial, similar to the way it's done in darcs, i.e. it asks me for each hunk and file whether I want to revert it? Is it possible using TortoiseHg?

Thanks

+2  A: 

The record extension is inspired by darcs record. It will allow you to add only specific hunks to the next commit, i.e., the opposite of what you want. But you could add all hunks except the one you want to revert and then do a hg revert to revert it. A little backwards, I know... :-)

You could also do hg diff > patch; hg revert, edit patch to delete the hunk and do hg import --no-commit to reappy the patch. That is likely faster, but requires you to manually edit the patch. I've had great success with the Emacs diff-mode, but since you ask about TortoiseHg you might not want to use Emacs.

Martin Geisler
I do use Emacs all the time, I'm just not completely familiar with the Hg support in it. I'll look into it and hopefully it's just like any other VC mode... Thanks for the suggestion!
Deniz Dogan
Great. I've only used Mercurial a little from within Emacs: `C-x v =` does a `hg diff` on the current file, and `C-x v v` does a `hg commit` on the current file. That is sometimes nice when I work on a repository where I know that checking in just the one file is okay.As for editing the patch, then that is independent of Mercurial. It just uses Emacs' diff-mode which knows how to update the line numbers when you delete stuff from a patch.
Martin Geisler
+2  A: 

For reversing a changeset on a single file try:

hg diff -c | patch -R

That will reverse the changeset introduced by that revision on that filename. Now if the same darcs/git style cherry-picking behavior could be included in that somehow I would be very happy.

Pinballkid
You probably need to make that `patch -R -p1` or higher levels of `-p`, depending on your current working directory within the repository.
Paul Biggar