一文看懂 Git 的底层工作原理( 二 )


我们切一个新分支 feat/work:

一文看懂 Git 的底层工作原理

文章插图
图片
查看下 refs/heads/master 和 refs/heads/feat/work 中的 commit 值:
一文看懂 Git 的底层工作原理

文章插图
图片
从其内容可以看到,feat/work 这个 branch 并没有创建任何新的版本文件,和 master 一样指向了 c5bc98 这个 commit 。
从上面的实验可以看出,一个 branch 其实只是一个 commit 对象的应用,Git 并不会为每个 branch 存储一份拷贝,因此在 git 中创建 branch 几乎没有任何代价 。
接下来我们在 feat/work 这个 branch上进行一些修改,然后提交:
$ git:(feat/work) echo "new line" >> src/file1.txt$ git:(feat/work) echo "do nothing" >> License$ git:(feat/work) git add .$ git:(feat/work) git commit -m "some change"
一文看懂 Git 的底层工作原理

文章插图
图片
查看当前的 HEAD:
一文看懂 Git 的底层工作原理

文章插图
图片
可以看到 HEAD 指向了 feat/work 这个 branch,而 feat/work branch则指向了 8a442 这个commit,master branch 指向的 commit 未变化,仍然是 c5bc98 。
查看 8a442 这个commit对象的内容:
一文看懂 Git 的底层工作原理

文章插图
图片
可以看到 commit 有一个 parent 字段,指向了前一个 commit c5bc98 。还包含了一个 tree 对象(2a9dd):
一文看懂 Git 的底层工作原理

文章插图
图片
可以观察到,由于 README 没有变化,还是指向的 065bca 这个blob对象 。License 是一个新建的 blob 对象,src 和 file1.txt 则指向了新版本的对象 。
增加了这次 commit 后,Git 中各个对象的关系如下图所示:
一文看懂 Git 的底层工作原理

文章插图
图片
Tag 和 branch 类似,也是指向某个 commit 的指针 。不同的是 tag 创建后其指向的 commit 不能变化,而 branch 创建后,其指针会在提交新的 commit 后向前移动 。




推荐阅读