summaryrefslogtreecommitdiff
path: root/src/content/tils/2020/08/14
diff options
context:
space:
mode:
Diffstat (limited to 'src/content/tils/2020/08/14')
-rw-r--r--src/content/tils/2020/08/14/browse-git.adoc67
1 files changed, 29 insertions, 38 deletions
diff --git a/src/content/tils/2020/08/14/browse-git.adoc b/src/content/tils/2020/08/14/browse-git.adoc
index d06f0c1..556288c 100644
--- a/src/content/tils/2020/08/14/browse-git.adoc
+++ b/src/content/tils/2020/08/14/browse-git.adoc
@@ -1,28 +1,15 @@
----
-
-title: Browse a git repository at a specific commit
-
-date: 2020-08-14
-
-layout: post
-
-lang: en
-
-ref: browse-a-git-repository-at-a-specific-commit
-
-eu_categories: git
-
----
+= Browse a git repository at a specific commit
I commonly use tools like `git log` together with `git show` when inspecting
past changes in a repository:
-```shell
+[source,shell]
+----
git log
# search for a the commit I'm looking for
git show <my-commit>
# see the diff for the commit
-```
+----
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.
@@ -30,55 +17,59 @@ 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:
-```shell
+[source,shell]
+----
git clone <original-repo> /tmp/tmp-repo-clone
cd /tmp-repo-clone
git checkout <my-commit>
-```
+----
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` global git flag. This is what `man git` says about it:
-```txt
+[source,txt]
+----
--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
+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/`:
-```shell
+[source,shell]
+----
mkdir copy
git --work-tree=copy/ checkout .
-```
+----
-After that `copy/` will contain a replica of the code in HEAD. But to checkout a
-specific, we need some extra parameters:
+After that `copy/` will contain a replica of the code in HEAD. But to checkout
+a specific, we need some extra parameters:
-```shell
+[source,shell]
+----
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 `git-checkout` which
-sub directory of `<my-commit>` we want to look at. Which means we can do
-something like:
+Morse signals to git, but we're actually saying to `git-checkout` which sub
+directory of `<my-commit>` we want to look at. Which means we can do something
+like:
-```shell
+[source,shell]
+----
git --work-tree=<dir> checkout <my-commit> -- src/
-```
+----
And with that `<dir>` will only contain what was inside `src/` at `<commit>`.
After any of those checkouts, you have to `git reset .` to reset your current
staging area back to what it was before the checkout.
+== References
-## References
-
-1. [GIT: Checkout to a specific folder][0] (StackOverflow)
+:so-link: https://stackoverflow.com/a/16493707
-[0]: https://stackoverflow.com/a/16493707
+. {so-link}[GIT: Checkout to a specific folder] (StackOverflow)