how do you revert 1 or more committed files in mercurial but NOT the entire changeset

The exact command you wanted to use would have worked if you used hg revert instead of hg update

hg revert -r .^ File_C
hg commit -m "put C back"

In most cases VonC's solution is just perfect. However, if rollback is no option (e.g. because the commit in question is not the last one or because you did a complex partial commit), then you can do a new commit with the reversed diff of the unwanted changes to File_C:

hg diff -c REVISION --reverse File_C | hg import -m "Revert changes to File_C" -

Where REVISION refers to the commit where File_C has been committed accidentally. The first command produces the reversed diff for the file in question. It's output is piped to hg import (don't forget the trailing -).

UPDATE: You can also use the backout command:

hg backout -I File_C REVISION
hg commit -m "Revert changes of File_C in REVISION" File_C

The backout command changes your working copy in that it undoes the changes to File_C commited in rev. REVISION. Afterwards the revert is committed explicitly.


You could use hg rollback to undo your last commit, and then re-do it again, this time without the file C.
(as mentioned in Mercurial FAQ, and also in this FAQ entry where it is noted that "there is no backup when you rollback a transaction", so use it with caution)

Tags:

Mercurial