git將引用保存在文件中,原理很簡單
引用原理
引用指的是對提交記錄的引用
提交記錄用哈希值唯一標識
每個引用用一個文件表示,文件中保存其引用的提交記錄的哈希值
引用分類
- 分支
- 可變, 在不同的時刻可以指向
不同的提交記錄 - 本地分支
- 對應
.git/refs/heads/目錄中的文件 - 每個
本地倉庫有多個本地分支
- 對應
- 遠程分支
- 對應
.git/refs/remotes/<遠端倉庫名>/目錄中的文件 - 每個
本地倉庫可以對應多個遠端倉庫, 同時每個遠端倉庫可以有多個遠端分支
- 對應
- 可變, 在不同的時刻可以指向
- tag
- 對應
.git/refs/tags/目錄中的文件 - 不可變, 除非刪除后重新創建, 否則總是指向
特定的提交記錄 - 每個git倉庫可以有多個
tag
- 對應
- HEAD
- 對應
.git/HEAD文件 - 可變
- 通常指向某個
本地分支,即引用的引用 - 也可以直接指向
某個提交記錄,稱為HEAD detached, 即分離頭指針狀態 - 也可以指向
tag,git將這種情況也處理成HEAD detached - 也可以指向
遠端分支, git將這種情況也處理成HEAD detached
- 通常指向某個
- 每個git倉庫只有一個
HEAD - 表示當前
工作區檢出的文件(或者說文件在修改之前)是屬於哪個提交記錄的 git checkout 指令,就是在改變HEAD的指向git checkout 本地分支名git checkout 提交記錄哈希值, detachedgit checkout 遠端分支名, detachedgit checkout tag名, detached
- 對應
實驗
$ git checkout master
Switched to branch 'master'
$ cat .git/HEAD
ref: refs/heads/master
$ cat .git/refs/heads/master
89d496d44f93d107a7eb404890cd15a14ba8845d
checkout master后, HEAD指向master, master指向89d496
$ git checkout milestone
Note: checking out 'milestone'.
You are in 'detached HEAD' state.
HEAD is now at eecc5fe milestone
$ cat .git/refs/tags/milestone
eecc5fe060e5b86957f931fd931beae4f206d4eb
$ cat .git/HEAD
eecc5fe060e5b86957f931fd931beae4f206d4eb
checkout tag milestone后,HEAD指向eecc5f, detached HEAD
