記錄如何解決 Git 從 HEAD 切換到 master 分支部分交付不見/不見的問題
前陣子再一個經常操作的專案上做了 git commit 後,從當前的 HEAD 切換到 master 分支,部分交付的 commits 在 HEAD 操作的就全部遺失了,在 git cli 或 sourcetree 上都無法透過指令顯示不見的 HEAD 分支.
後來想到 Git commit 的特性,就透過 git reflog 指令然觀看全部 git 的操作記錄,裡面詳細記載你曾經下過的 git 指令:
git reflog
這邊找到了移動到 master 分支前的一個 commit 的雜湊值(hash)為 596f379….(後面省略).
這邊可以馬上透過建立 tag 的指令將當前消失的 commits 顯示出來:
git tag emergency 596f379
當完成後回到 SouceTree 就可以看到結果如下:
Why HEAD branch commits disappeared
這邊說明一下 HEAD 分支與那些 commits 原先之所以在切換到 master 會完全消失的原因在於:
- 任何 commit 需要有一個以上的 label
- 所屬哪一個 branch 屬於一個 label
- commit 被標示一個 tag 屬於一個 label
- HEAD 是一個 tag
詳細內容可以參考 Git-內部原理-Git-References.
當 HEAD 往新的 master branch 移動時,先前的 commit 因為沒有任何所屬的 branch, 所以除非給予一個 tag ,不然就真的消失了(其實是看不到而已)。而透過 git reflog 指令可以顯示所有操作的內容,從此指令我們就可以抓到消失的 sha1 ,並透過 git tag 指令給予一個 label 將所有相關 commits 顯示出來。
一個很久沒遇到的問題,這邊筆記一下以免下次又找半天.