2017-06-19 15 views
0

提交後,我提醒我處於分離HEAD狀態。`git log --all`如何錯過一個提交點?

> git commit -m "Implemented Runrealfast algorithm" 
[detached HEAD af46ac9] Implemented Runrealfast algorithm 
2 files changed, 18 insertions(+), 1 deletion(-) 

我忽略了分離的頭,並回溯到一對夫婦犯點:

> git checkout 87e147e 
> git stash -u 
> git checkout ed157a3 

在運行沿途git stash -u

最後,我試圖找到犯SHA我此前

> git log --all | grep Runrealfast 
(no output) 

製成,但git log --all不顯示它。

幸運的是我的航站樓有完整的歷史。我從終端的消息中確定相關的SHA並運行:

> git checkout af46ac9 

並且提交問題顯示沒有問題。

git log --all如何錯過提交點?一個獨立的HEAD也是一個懸而未決的提交?

+0

通過檢查提交'87e147e'和'ed157a3'你已經將'HEAD'從'af46ac9'移開,因此它不再被引用,也沒有被'git log'達到。 – mkrieger1

回答

1

--all有幾個原因可能會錯過提交。這可能聽起來很奇怪,但事情是--all並不意味着所有提交

寧可--all的意思是「所有參考」。因此,您可以獲得當前HEAD提交的(簡化)歷史記錄,以及每個分支,每個標記,每個遠程跟蹤分支,由filter-branch創建的每個備份參考,最近的存儲以及其他一些可能的結果。 (爲什麼「簡化」?我會回來的。)

但是你的提交沒有那些。你問:「是否脫離頭也是一個懸而未決的承諾?」答案是: ...但在你的情況下,有點。

分離頭只意味着你目前不在任何分支。你可能會在一個懸而未決的提交。或者你可能在一個或多個refs歷史上的提交,但通過檢查遠程分支ref名稱,SHA ID,標記名稱等而不是分支名稱來實現。

但是當然,如​​果你處於獨立的頭狀態並且你做了一個新的提交,那麼這個新提交作爲一個懸而未決的提交開始。

在這種情況下,最可靠的方式找到的承諾是看引用日誌的HEAD

git reflog 

,或者,如果你想輸出的樣子git log輸出,

git log --reflog 

這隻能在創建懸掛提交的回購庫(可能是唯一具有提交回購的回購)內進行計算,在創建提交之後的合理時間內(推薦日誌最終到期)以及假設您沒有明確損壞提交日誌(使用強制reflog過期的命令,或者通過與.git/logs目錄混淆)。

順便說一句,我說歷史上曾「簡化」:有些時候git log --all將跳過一個承諾,即使它是在裁判的歷史。這是因爲git確定它可以在不包含違規提交的情況下解釋每個文件的當前狀態。有關git意味着什麼的詳細說明,請參閱git log文檔;如果你想確保你看到每一個非懸掛提交,你必須添加--full-history以及--all

2

Git docs

--all

假裝彷彿在refs/所有裁判,與HEAD一起,在命令行上被列爲<commit>

您之前分離的HEAD的提交不是ref(鬆散地說,它沒有名稱),因此未列出。

請注意,如果你想回到那個提交,git reflog可能是一個更方便的援助,希望你能通過終端考古學找到它!