我們知道在git中分支是指向提交,而head指標指向分支。所謂的分離頭指標狀態就是head不再指向分支,而是直接指向某個commit。
對於下圖,此時分支master分支指向c1(c1是某次提交的commit id),head指向master。
進行任意一次提交,master分支會重新指向新的提交。
如果執行git checkout commitid
就會導致head指向該次提交,而不在指向分支。
如果我們執行git checkout c2
(c2是該次提交的commit id),結果如下:
可以看到此時head指標不在指向master而是直接指向c2提交,此時頭指標就處於分離狀態。
如果這時候修改了工作區的內容然後提交會怎樣呢?
可以看到此時這個提交不在任何分支上。如果此時切換回master分支,你會發現剛剛在分離頭指標狀態下對檔案做了修改提交在master分支下是看不到的,並且由於c3這次提交不在任何分支上,在未來極有可能會被git清理掉。我們知道如何合併分支,但是沒辦法將c3這個提交給合併過來,難道我們剛剛在c3上做的大量修改都要重寫?聰明的git早就給我們提示了,可以給這個分離的提交建立乙個分支,然後在將這個分支合併到master中,最後刪除這個臨時的分支。
通過git branch branchname commitid
給這個提交建立乙個臨時的分支,這個分支是基於頭指標分離下修改提交的commit id建立的。
合併分支:git merge temp
最後刪除臨時分支:git branch -d temp
建立乙個倉庫,在工作區增加test.txt,然後基於這個檔案做兩次commit。
可以清楚的看到此時的head是指向master的(head -> msstaer),,而master指向最近一次提交。看一下test.txt檔案:
現在開始分離head指標,讓head直接指向最近一次提交。
注意觀察,當我們執行git checkout 8fcba5e37c
,git會提示我們當前處於分離頭指標狀態,並且head指向8fcba5e37c這次提交。
執行git status
看看
現在head指標指向的是提交,這時我們再修改test.txt檔案,然後提交。
git提示我們再分離head指標狀態下提交了修改。再開啟test.txt檔案看一眼:enmmm,沒毛病。
重點來了!現在切換回master分支:
ok!成功切換了,但是git給我們警告了,有乙個未被關聯在任何分支上的提交,並且告訴我們可以使用git branch branchname 5e2e3f7
為5e2e3f7這次提交建立乙個分支。先來瞅一眼此時的test.txt檔案:
enmm,確實少了789。如果我們執行gitk --all命令會彈出乙個介面如下:
從這個介面我們可以發現,只能看到兩次提交記錄,關於789的提交記錄看不到,這是因為它沒有關聯在任何分支上,並且在未來git也極有可能會把它清理掉。
執行git branch temp 5e2e3f7
為該提交建立乙個temp分支,然後合併分支,最後刪除temp分支:
最後再瞅一眼test.txt。enmm,沒毛病。
分離頭指標(detached HEAD)
通常,我們工作在某乙個分支上,比如 master 分支。這個時候 master 指標和 head 指標是一起前進的,每做一次提交,這兩個指標就會一起向前挪一步。但是在某種情況下 例如 checkout 了某個具體的 commit master 指標 和 head 指標這種 繫結 的狀態就被打破了,變...
頭資訊 系統掌握Git之 分離頭指標與合併操作
分離頭指標表示我們在工作在沒用分支的情況下,我們通過git log 列印日誌,選擇中間的乙個commitid,然後進行checkout操作,git checkout 82fdac4baac702ad0473c講git切換到這次提交。在通過git branch檢視分支,可見當前分支在 頭指標分離於 8...
Git游離指標狀態
問題描述 有次在idea中提交git發生了這樣的情況,當初上乙個操作之前還提示了stash changes的,然後就進入了游離指標狀態 在這裡可以發現這裡的git分支指向的不是當前任何分支 游離狀態 本質上是 本地的head 指向了乙個 未知的分支,head不會指向任何分支,嚴謹的說是head指向了...