2021年8月1日 星期日

git branch分支 和 tag標籤 的差別

git branch分支 和 tag標籤 的差別

一句話描述的話

他們都是用來替提交點取別名,省得我們輸入一長串看不懂的亂碼。
標籤只能標記一個哈希碼,分支則是包含起點與終點,並且終點會自動更新。




提交點

git的提交點,每一次的提交都會產生一個HashCode哈希碼,這個碼是一串亂碼用來當作提交點的唯一識別碼。

提交點是具有向前追蹤功能的,任一提交點都會記錄上一個提交點,有點類似單向鏈結這樣可以一直往前追蹤連到最初始的點。

這邊有一個小小的知識點不管你做什麼操作都不會被刪除。只要記住提交點的哈攜碼就隨時都能返回。

git上的任何指令操作都不會破壞提交點,包含撤銷這次提交也是不會刪除。

提交點是一串亂碼很難被記住,所以有兩個方式可以為他們取暱稱,也就是分支和標籤。同一個提交點並不限一個標籤、分支。

標籤

標籤只是單獨為提交點取另一個名字方便呼叫而已,本身基本等同於哈希碼的重新命名。要說區別就是被標籤住的提交點,不會因為放太久而被清除。

利用剛剛說的特性,git提交點絕對不會被指令刪除,還有每個提交點都有上一點的紀錄。這樣把提交點取個tag就永遠不會遺失了。

如果要做什麼危險操作的時候可以直接把當前分支tag起來,這個tag保證可以讓你回到最初的狀態。

就算你不tag單純只是把提交點的哈希碼記住也是一樣意思,只是時間不能拖太久,一段時間後無效提交點會被git自動回收刪除掉。

無效提交點:打個比方跟野指標一個意思,該提交點不在任何標籤或分支的鏈結內。

分支

分支跟標籤相比起來多了兩個功能

  1. 自動追蹤新的提交點
  2. 會記錄起始點

自動追蹤新的提交點

創建倉庫之後的預設名字 master 就是一個分支,分支會指向一個提交點,當這個提交點執行git命令產生新的提交點的時候,分支會自動更新指向的提交點。

比如說 現在在A點,當我執行git命令產生新的提交點B的時候,分支會自動更新指向的點,指向新的B點。

當我執行撤回提交的命令時也不是刪除C點而是單純,把分支指向的位置從C改成B而已。

包含起始點

在絕大多數的情況下,所謂的起始點就是從主線出來的那個點,基本上不會理會起始點的問題。

只是有些極端情況下會問題,就是你的分支是在提交之後建立的,因為從分支圖上面完全看不出來可能會被坑。

模擬一個情況,你提交的時候忘記切分支直接提交了,這時候提交點是在主線上,好死不死這段期間主線又更新了,你就很尷尬變成這個狀態,你的提交點是個野指標

a.jpg

然後你又直接對這個點新增分支

b.

看上去很完美對吧,然後因為看上去沒問題開心的繼續改代碼提交

c.

圖很完美完全正確,事實上剛剛說野指標的地方到時候rebase -i 的話會發現壓根就不會出現

沒有留言:

張貼留言