Забыл в последней статье упомянуть про HEAD.
В файле
.git/HEAD лежит ссылка на рефернс. 09:32:21 in tmp/git_/first on master •99%
➜ cat .git/HEAD
ref: refs/heads/master
С помощью команды
git symbolic-ref HEAD refs/heads/<branch_name>
Можно ставить HEAD.
Теперь можно полностью понять как работает
git checkout <branch> .cat .git/HEAD
cat <ref_path>
git cat-file -p <commit_hash>
git cat-file -p <tree_hash>
И дальше уже проходим по blob-ам, и записываем туда версии.
P.S Это весьма топорная реализация
git checkout , на самом деле все работает немного иначе.Впереди нас еще ждет статья про
pack файлы и про то, как git оптимизирует хранение файлов.