hitfactory
hitfactory

Reputation: 3006

How to revert a folder to a particular commit

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?

Upvotes: 132

Views: 96207

Answers (3)

Jesse
Jesse

Reputation: 3827

The git restore command is the command designed restore files and directories to the state they were in a different commit. If you specify a directory to restore, it will also remove files that were not present in the commit you are restoring from.

To restore the content of directory somefolder to the state it was in commit e095, you can run:

git restore -s e095 somefolder

By default, git restore restores content to the state it was in HEAD, but by using the -s switch (short for --source), we can restore content to the state it was in any commit.

Upvotes: 4

Matthew Buckett
Matthew Buckett

Reputation: 4371

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

Upvotes: 87

jamessan
jamessan

Reputation: 42727

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

Upvotes: 208

Related Questions