【學了就忘】Git操作 — 67.分離頭指針狀態

1、什麼是分離頭指針狀態

Git在使用的時候有一種狀態,叫做分離頭指針狀態,也叫detached HEAD

我們之前的更新中可以瞭解到,在Git中HEAD指針指向分支,而分支是指向提交。所謂的分離頭指針狀態就是HEAD指針不再指向分支,而是直接指向某個commit。

正常狀態結構圖:


分離頭指針狀態結構圖:

即:分離頭指針狀態就是指HEAD指針脫離了分支指針。

2、復現分離頭指針場景

(1)查看當前版本庫狀態

1)查看當前工作的分支

當前工作在master分支上。

2)查看當前版本庫日誌

(2)場景復現

可能這個時候,我們對其中某一個commit很感興趣。

比如:對temp分支提交的temp2.txt文件很感興趣,想切換到temp分支上去研究一下。

在切換分支的時候,會出現這麼一種情況。要執行git checkout 分支名命令,但是執行了git checkout + commit_id。不小心把分支名稱的位置,寫成了你感興趣的那個提交的ID了。

如下圖所示:

說明上圖中出現一長串信息:

  • Note: checking out '40e2e66'.:Git正在基於這個commit,做一個切換分支(checkout)的活動。
  • You are in ' detached HEAD' state. You can look around, make experimental changes,and commit them, and you can discard any commits you make in this state without
    你正處在分離頭指針的狀態,你可以做一些變更產生commit,或者你也可以把這些commit丟棄掉。
    (就是在分離頭指針的狀態下你可以繼續做開發,然後繼續產生commit,而且不會影響其他分支)

解釋一下:

  • 分離頭指針狀態的含義,其實本質上是說我們現在正工作在一個沒有分支的狀態下
  • 不好的方面:
    在這分離頭指針狀態下,你可以繼續產生commit,並且不會影響到其他的分支。如果你有需要切換到其他的分支需求,這個時候一旦切換,那分離頭指針狀態下開發出來的commit,因爲沒有branch和他掛鉤,這些沒有branch掛鉤的commit,最後很可能被Git當作垃圾給清除掉,所以這個是他危險的地方。
    也就是說如果你想變更工作分支,請先把這些提交和某個分支掛鉤,此時這些commit,Git是永遠不會把他清除掉的,這就是分離頭指針使用的時候需要注意的地方。
  • 好的一方面:
    就是我們想做一些變更,而這個變更你只是嘗試性的變更,沒準實踐下來你覺得效果不好,你完全隨時可以把他扔掉,扔掉就是你不要去理會他,你切換到新的分支就可以了,這就是分離頭指針狀態帶來的好處。

上面的提示信息也進行了說明:

If you want to create a new branch to retain commits you create, you maydo so(now or later) by using -b with the checkout command again.

Example: git checkout-b <new-branch-name>

如果您想創建一個新的分支來保留您創建的提交,您可以(現在或以後)通過使用git checkout -b命令來實現。

示例:git checkout -b <new branch name>

最後還提示你:

HEAD is now at 40e2e66 temp分支提交文本temp2.txt

提示HEAD指針正在指向的位置是,40e2e66對應的commit上。

3、分離頭指針狀態下操作

上邊場景中,我們已經進入了分離頭指針狀態。我們進行一些操作,看看會有什麼情況發生。

(1)修改temp2.txt文件內容

在文件中添加一行66666666666666。

(2)查看Git暫存區文件狀態

可以看到Git又在提示我們,HEAD detached at 40e2e66
說明此時的HEAD指針沒有指向任何的分支,而是指向了某一個沒有分支的commit。

(3)提交此次變更

可用一種偷懶的方式,但不推薦使用,從工作區直接提交到版本庫中。
執行命令$ git commit -am '修改temp2.txt文件內容'

(4)查看一下Git版本歷史情況

這裏請大家留意一下HEAD的位置,之前的HEAD出現,總是和某一個分支綁在一起的,此時這個HEAD並沒有任何的分支綁定,這個就叫分離頭指針的狀態。

(5)查看一下本地倉庫分支情況

也證明了此時正工作在分離頭指針狀態

4、分離頭指針狀態不好的情況

(1)假如這個時候,需要去做其他的任務,要切換到master分支。

執行命令$ git checkout master

可以從上圖中看到,Git會發出一段警告:

  • Warning:you are leaving 1 commit behind,not connected to any of your branches:
    25d5574 修改temp2.txt文件內容
    說有一個提交,ID值25d5574的commit ,未連接到任何分支,也就是這個commit沒有加入到任何分支。
  • If you want to keep it by creating a new branch,this may be a good time to do so with:
    git branch <new-branch-name> 25d5574
    這裏還再一次友情提示你,如果您想創建一個新的分支來保留它,那麼現在可能是一個很好的時機。
    執行git branch <new-branch-name> 25d5574 命令來創建。
  • Switched to branch 'master':並且在最後告知你,你已經切換到master分支了。

(2)查看想在的分支情況

我們操作到上面步驟,不做任何操作,通過gitk --all來查看現在的分支情況。

發現圖中的Git歷史樹中,並沒有看到我們之前提交的25d5574commit。

說明在Git眼中,你沒有把一個commit跟某個分支綁定,也沒有把這個commit跟某個tag綁定。那在Git的眼裏,這種commit都是不重要的,是日後都要被清除的。

(3)保留分離頭指針狀態下修改的內容

如果這個時候我突然覺的這個commit很重要,(此時已經切換了分支),還可以繼續按照他的指示信息。

執行命令$ git branch newbar 25d5574

再創建一個分支,把之前的commit保留下來。

之後,在通過gitk工具查看一下。

這個修改temp2.txt文件內容的commit又出現了,並被保存在新創建的分支上。

(圖中的分支線條乍一看,可能優點亂,按照分支線路慢慢看,是能看明白的)

5、總結

  • 分離頭指針狀態指的是,HEAD指針不再指向分支,而是直接指向某個commit。
  • 一個變更(提交)沒有基於任何的branch(分支)去操作時,當你進行分支切換的時候,在分離頭指針上產生的commit,很可能會被Git當作垃圾清理掉。如果你認爲這些變更是重要的,要切記一定要和某個分支綁定在一起。
  • 通過上邊練習的例子,我們發現在使用Git的時候,一定學會好好的看Git給出的提示。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章