124

Here's my history for the folder 'somefolder'

$ git log somefolder

commit 89cd
More changes to somefolder

commit ef47a
Updating somefolder and other stuff

commit e095
Bugs fixed in somefolder

I want to revert somefolder back to the 'Bugs fixed in some folder" commit.

Since the second commit involved changes outside of somefolder, I don't want to revert this commit.

I guess the safest way would be to create a diff/patch between commit e095 and 89cd that applies just to some folder, and then apply that patch. How can I do that?

peterh
  • 11,875
  • 18
  • 85
  • 108
hitfactory
  • 2,896
  • 5
  • 24
  • 22

2 Answers2

202

You can use git checkout to update your repository to a specific state.

git checkout e095 -- somefolder

As for your question about generating the diff, that would work too. Just generate the diff to go from your current state back to e095:

git diff 89cd..e095 -- somefolder
jamessan
  • 41,569
  • 8
  • 85
  • 85
  • 40
    this doesn't remove files that were added in that commit, use `git reset e095 -- some/folder` instead – shime Jan 29 '15 at 13:10
  • 9
    From git 2.22 you can use [`--no-overlay`](https://git-scm.com/docs/git-checkout#Documentation/git-checkout.txt---no-overlay) for `git checkout` so that tracked files that are not in commit you are checking out from will be removed. – Mariusz Pawelski Jun 22 '19 at 20:20
82

You can use git reset to reset the index which will also include removing files that were added in more recent commits (git checkout on it's own doesn't do this):

git reset e095 -- somefolder

However git reset doesn't update the working copy and the --hard option doesn't work with folders. So then use git checkout to make the working copy the same as the index:

git checkout -- somefolder

and then if you also want to remove any files added you also need todo:

git clean -fd somefolder
Matthew Buckett
  • 4,073
  • 1
  • 36
  • 28