2013-05-03 77 views
16

我經常會參考git log --graph --decorate --oneline --all --full-history來查看我的分支的當前狀態,但它不顯示分離的頭部/匿名分支。有沒有辦法讓分離的頭部出現在這個圖表中?有沒有一種工具可以讓git在圖中顯示「分離頭部」?

我知道git reflog存在,但由於沒有結構,因此很難閱讀 - 所有您必須繼續的是提交消息,如果尚未完成提交,它仍可能是WIP。

一些背景(這不是回答問題所必需的,但將有助於解釋它的動機):我是Mercurial用戶,我的工作流涉及很多匿名分支。我傾向於使用hg heads很多來檢查這些頭,並經常hg rebase分離或結合一系列的提交的基礎上,爲了便於理解代碼審查的目的有意義。

雖然我習慣了使用git,但是我經常發現自己有分離的頭部,例如,我重新綁定了某個分支的某些提交以創建新分支。找到這些分離的頭部令人討厭git reflog,說實話,它有點可怕,他們只是從平常的git log消失。我甚至忘記了舊的提交方式,並且在一兩天後不得不從git reflog中挖出。在Mercurial中,這些提交仍然是一個匿名頭像,我會提醒我需要完成它們。

回答

14

聽起來好像你正在嘗試使用與git工作方式不完全匹配的工作流程。

首先,git中的「detached head」與Mercurial的「head」概念不一樣。 Git只有一個HEAD,它只是當前簽出的提交。 「分離」意味着你目前沒有檢出分支。所以當你創建一個提交時,它不會與分支相關聯,並且當你簽出一個不同的提交時它會丟失。

在Git中,你應該關心的每個提交應該可以從某個分支到達。沒有「匿名分支」這樣的事情,這就是爲什麼git在分離的頭上提交時警告你的原因。承諾分離的頭像分配一個對象,然後扔掉指針;這是可能的,但幾乎從來沒有你想要做的。請記住,git中的分支是輕量級的,可以是短暫的。在提交之前創建一個分支,以便您可以再次找到提交。

所有這一切是說,如果你真的想看到你的資料庫的結構,包括只從reflogs引用的提交,你可以使用:

git log --graph --decorate $(git rev-list -g --all) 
+0

這聽起來很懶散,但有想到的事先分支的名字很煩人。那我以後也必須刪除這個名字。這聽起來並不輕鬆。我想知道是否有一個擴展可以爲我保留指向每個未命名分支的指針。然後,如果我決定保留它,我可以重命名分支,或者如果我想讓它被分享,就可以刪除它。 – dmnd 2013-05-03 23:28:25

+0

@dmnd你有拉丁字母來減輕你的生活。當你想分支時,執行'git checkout -b a'。它將創建一個名爲'a'的分支,它非常像一個匿名分支,因爲它的名字絕對沒用。如果你用這種方式寫出來的話,你正在做一些git不適合的東西。也許你可以在你的問題中提到,如果你不指定分支,你究竟如何跟蹤你的工作。你是否定期檢查提交消息?人們也傾向於使用別名,所以你可以將上述縮寫爲'gco -b a'。儘管如此,您仍然需要爲分支使用唯一的名稱。 – 2013-05-03 23:39:24

+2

我不知道這樣的擴展,但它聽起來很直接。用一個shell腳本代替「git commit」,首先測試HEAD是否被分離(通過檢查'git symbolic-ref HEAD'的退出狀態),如果是,則使用你喜歡的任何命名方案創建一個新分支。 – David 2013-05-03 23:44:23

相關問題