tags:

views:

813

answers:

3

Is there a command that allows you to partially undo the changes to a file (or files) in the working directory? Suppose you have edited a file a lot but you realise that you want to undo some of them to the committed state but not others. I'm envisaging an option for git checkout that works a lot like git add -p i.e., it goes through the file hunk by hunk and asks if you want to keep it or not.

+1  A: 

git checkout $file reverts the state of the file $file to the last committed state. I think you can use git checkout SHA-1 -- $file to revert the file to the commit identified by SHA-1.

Koraktor
yeah, not exactly what I want, since I want to keep some of the changes I have made in the file and revert the others
1800 INFORMATION
+1  A: 

How many commits do you need to go back and select from? If it's just one, maybe take a branch just before it, checkout the file you committed and then use git add -p to add it how you wanted it. Then you can go back to where you were and checkout the file from your temp branch.

that is:

git checkout -b temp troublesome-commit^
git checkout troublesome-commit -- path/to/file
git add -p path/to/file
git commit -c troublesome-commit
git checkout @{-1}
git checkout temp -- path/to/file
git commit path/to/file
git branch -D temp

Other alternatives include going back and editing the commit with git rebase -i (marking the commit as edit, then doing a git reset HEAD^ and redoing the commit when dropped back into the shell).

If the changes you need to select from are spread over a series of commits, it may be better to extract them as patches (or a patch covering all of them) and hand-edit the patch, taking out the changes you want to keep, and feeding the residual into git apply --reverse.

araqnid
I'm not actually wanting to revert anything that is committed, I want to undo changes that are only in my working copy
1800 INFORMATION
+4  A: 

You could use

git add -p <path>

to stage the chunks that you want to keep in a particular file, then

git checkout -- <path>

to discard the working tree changes that you didn't want to keep, by checking out the staged version of the file.

Finally, you can use

git reset -- <path>

to revert the staged version of the file to the most recent committed version of the file to leave you with your changes unstaged.

Charles Bailey
I think this is what I am looking for thanks
1800 INFORMATION