git引用初識(HEAD、分支、tag)


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 提交記錄哈希值, detached
      • git checkout 遠端分支名, detached
      • git 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM