Reputation: 1649
I would like to restore a whole directory (recursively) from the history of my git repository.
There is only 1 branch (master).
I know the commit where errors were included.
Can I use the sha1 hash of the parent commit to restore the state of the directory as it was before the errors were included?
I thought about something like this:
git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 path/to/the/folder/
but it did not work.
Upvotes: 130
Views: 102467
Reputation: 6188
You can do git checkout master -- path/to/the/folder-you-want-to-restore/
to restore a directory or file on your local branch from the master
branch.
Upvotes: 3
Reputation: 1797
For modern git (-s
or --source
):
git restore -s commit-sha-that-contains-dir relative/path/to/folder
man reference:
-s <tree>, --source=<tree>
Restore the working tree files with the content from the given tree. It is common to specify
the source tree by naming a commit, branch or tag associated with it.
If not specified, the contents are restored from HEAD if --staged is given, otherwise from the index.
As a special case, you may use "A...B" as a shortcut for the merge base of A and B if there
is exactly one merge base. You can leave out at most one of A and B, in which case it
defaults to HEAD.
Upvotes: 13
Reputation: 22972
try adding '--' between revisions and paths:
git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/
And if you want to recover a directory from the previous commit, you can replace the commit hash by HEAD~1, for example:
git checkout HEAD~1 -- path/to/the/folder/
Upvotes: 219
Reputation: 9886
If you simply do git checkout <SHA-ID>
then it will temporarily move you to that sha-commit.
Each commit object holds the entire structure of the disk at that time, so if you have files there and need to copy them out, you can do so. Warning though, you will not be in any branch, so you'll have to move back to master before copying the file into your working tree and commit it.
Upvotes: 1
Reputation: 17182
There are two easy ways to do this:
If the commit that included the errors only included the errors, use git revert
to invert the effects of it.
If not, the easy path is this:
git checkout 348…
cp -a path/to/the/folder ../tmp-restore-folder
git checkout HEAD # or whatever
rm -rf path/to/the/folder
mv ../tmp-restore-folder path/to/the/folder
git add path/to/the/folder
git commit -m "revert …"
Upvotes: 5