Currently, I am curious to find out what Git will do for us behind the scene if we run the 'git checkout [commit] [path]' command. Below are the logs coming from my experiment.
Reference: Git Book
Preparation
Create a brand new folder and run the 'git init' command.
Step 1:
Run the following commands to keep changing a file and make three commits
$ git add .
$ git commit -m 'v1'
[master (root-commit) 1491536] v1
1 file changed, 1 insertion(+)
create mode 100644 file.txt
$ git add .
$ git commit -m 'v2'
[master 9a8fa1e] v2
1 file changed, 1 insertion(+), 1 deletion(-)
$ git add .
$ git commit -m 'v3'
[master d0769a6] v3
1 file changed, 1 insertion(+), 1 deletion(-)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH9K6zggU9i3At9xfgCWrOm8-UuektndxnrUkqtSQOgJcFRwgEWVb56FlPZS6J1b8Rot3qP4mNvEdU9YyOq_lO0dHfi03VBPtArdmbajdWYjOoPgo1c4tS0pYPnyZAO3Kz4YY2-XfrCAuEhCK_nEabTsJ39SzoBZmHsXQfXuTlODG8XAk01ou0fbrNditT/w640-h362/git-reset-soft-01a.png)
Check the git status.
On branch master
nothing to commit, working tree clean
It is all synced (the three trees below keep the v3 version of file.txt).
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0xFnbA2j6kY2zX13ZAzfP6mvtaWp0UacHATwLzA93Ty4i3w-bgaETTlCzfnXEBnrlVcEZIV0FVW1j80kxWy0d0goy3l24D1_Sr7qBN5_0M-83AvdLENuJmfWqlbush0Rh3s95irhK8Xe1JlyczEdQdr3mblpxN3eHoq94t8W5S1wIcRle0E2mdCRA36NB/w640-h206/git-reset-soft-01b.png)
Check the .git tree structure.
$ tree .git/
.git/
├── COMMIT_EDITMSG
├── HEAD
├── branches
├── config
├── description
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── fsmonitor-watchman.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── pre-merge-commit.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ ├── pre-receive.sample
│ ├── prepare-commit-msg.sample
│ ├── push-to-checkout.sample
│ └── update.sample
├── index
├── info
│ └── exclude
├── logs
│ ├── HEAD
│ └── refs
│ └── heads
│ └── master
├── objects
│ ├── 14
│ │ └── 91536a26a35b6a0037cfa9ccbac70fecdb77d0 (git commit object for v1)
│ ├── 25
│ │ └── 7330bfc3b1cce445c8bf7202d88eca9ffff025 (git tree object for v2)
│ ├── 29
│ │ └── ef827e8a45b1039d908884aae4490157bcb2b4 (git blob object for v3)
│ ├── 62
│ │ └── 6799f0f85326a8c1fc522db584e86cdfccd51f (git blob object for v1)
│ ├── 8c
│ │ └── 1384d825dbbe41309b7dc18ee7991a9085c46e (git blob object for v2)
│ ├── 9a
│ │ └── 8fa1eee2b0d2841ffa1e5515935421c3d419e1 (git commit object for v2)
│ ├── a7
│ │ └── 949a02518883287c308f0b47e2a4934b111cc3 (git tree object for v3)
│ ├── cc
│ │ └── 5fda52eb3ed07cce6357ac11e392cd2dbf6d16 (git tree object for v1)
│ ├── d0
│ │ └── 769a6fa5bcf4c05f667eb635dd84c1174be895 (git commit object for v3)
│ ├── info
│ └── pack
└── refs
├── heads
│ └── master
└── tags
21 directories, 31 files
Check more info.
$ cat .git/HEAD
ref: refs/heads/master
$ cat .git/refs/heads/master
d0769a6fa5bcf4c05f667eb635dd84c1174be895
$ git ls-files -s
100644 29ef827e8a45b1039d908884aae4490157bcb2b4 0 file.txt (v3 version)
$ git log --oneline --decorate --graph --all
* d0769a6 (HEAD -> master) v3
* 9a8fa1e v2
* 1491536 v1
Step 2:
Let's run the following commands to edit the file.txt as the v4 version and update the Index.
Check the git status.
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: file.txt
Now, both the Index and the working directory keep the v4 version of file.txt.
Then run the 'git checkout [commit][path]' command.
$ git checkout HEAD file.txt
Updated 1 path from a7949a0
Check the git status.
On branch master
nothing to commit, working tree clean
The [path] both in the Index and the working directory got reset to v3 based on the [commit] which is HEAD in this case.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0xFnbA2j6kY2zX13ZAzfP6mvtaWp0UacHATwLzA93Ty4i3w-bgaETTlCzfnXEBnrlVcEZIV0FVW1j80kxWy0d0goy3l24D1_Sr7qBN5_0M-83AvdLENuJmfWqlbush0Rh3s95irhK8Xe1JlyczEdQdr3mblpxN3eHoq94t8W5S1wIcRle0E2mdCRA36NB/w640-h206/git-reset-soft-01b.png)
After running the 'git checkout[commit] [path]' command, we revert the commands from
to