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)