I commonly use tools like
git log together with
git show when inspecting
past changes in a repository:
But I also wanted to not only be able to look at the diff of a specific commit, but to browse the whole repository at that specific commit.
I used to accomplish it the “brute force” way: clone the whole repository in another folder and checkout the commit there:
But git itself allows we to specific the directory of the checkout by using the
--work-tree global git flag. This is what
man git says about it:
--work-tree=<path> Set the path to the working tree. It can be an absolute path or a path relative to the current working directory. This can also be controlled by setting the GIT_WORK_TREE environment variable and the core.worktree configuration variable (see core.worktree in git-config(1) for a more detailed discussion).
So it allows us to set the desired path of the working tree. So if we want to
copy the contents of the current working tree into
copy/ will contain a replica of the code in HEAD. But to checkout a
specific, we need some extra parameters:
git --work-tree=<dir> checkout <my-commit> -- .
There’s an extra
-- . at the end, which initially looks like we’re sending
Morse signals to git, but we’re actually saying to
sub directory of
<my-commit> we want to look at. Which means we can do
git --work-tree=<dir> checkout <my-commit> -- src/
And with that
<dir> will only contain what was inside
After any of those checkouts, you have to
git reset . to reset your current
staging area back to what it was before the checkout.
- GIT: Checkout to a specific folder (StackOverflow)