Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

mercurial

Say I have files File_A, File_B and File_C. I edit File_A and File_B on purpose but File_C I just added some debugging code that I don't plan to commit. Then by accident I do a

hg commit -m "comment" 

How do just revert/rollback/backout File_C? Basically I'd be happy to be able to go

hg update -r <oneRevBack> File_C hg commit -m "put C back" 

but update doesn't take a filter AFAIK so it's also going to revert File_A and File_B. I can copy File_C somewhere, hg update, then copy it back but that seems lame. Is there a way to do this directly in Mercurial?

like image 973
gman Avatar asked Feb 24 '11 06:02

gman


2 Answers

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" 
like image 58
Den Avatar answered Sep 29 '22 09:09

Den


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.

like image 23
Oben Sonne Avatar answered Sep 29 '22 09:09

Oben Sonne