2012-10-19 47 views
4

我想確定分支中的第一次提交。我已經閱讀過其他各種SO帖子(包括Finding a branch point with Git?),但他們不會給我以後的東西。如何在git中檢測分支點?

從查看分支圖我可以看出,有可能確定分支從主分支(在包含的圖像上,來自「第二次提交主分支」的紫色線),但是我無法複製這在使用命令行工具的文本(git log --graph工程,但不是我以後)。

我後面的提交是0124fc8,即第一次提交feature/new-branch。

所有合併回到主都與--no-ff完成。

我試過git merge-base feature/new-branch master,但是這給了我0f5e36f--all不相同)

我也試過git rev-list --boundary feature/new-branch...master,這給了我多次提交,但沒有一個是我想要的。

SourceTree showing a branch graph

回答

5

在沒有合併的返回到高手,git rev-list master..feature/new-branch的最後一項是你想要的。 a..b在rev-list中給出了b的歷史記錄中所有不在a的歷史記錄中的提交。但是既然你合併了,特性/新分支歷史中的所有提交也都在master的歷史記錄中,所以我們必須有點聰明。

您鏈接的問題(而不是this answer to it)提供了一個非常好的開始。訣竅在於使用--first-parent來避免將所有合併成爲主人的右手邊視爲主人歷史的一部分。 git rev-list --first-parent master爲您提供了直接提交給主的所有提交,並且不顯示任何已合併的提交。唉,--first-parent沒有按照我們想要的方式與..相結合,所以我們必須使用diff來製作我們自己的..等價物。我們可以使用diff來獲取我們在特性/新分支歷史記錄中提交的所有提交列表,並刪除主要「直接」歷史記錄中的所有提交。我用反斜槓跨越幾行拆分一個命令: -

diff --new-line-format=%L --old-line-format= --unchanged-line-format= \ 
    <(git rev-list --first-parent master) \ 
    <(git rev-list --first-parent feature/new-branch) 

diff選項使它只打印出在第二輸入線,但不是第一個輸入,沒有+或 - 東西,沒有標題。我對POSIX並不熟悉,所以可能只有GNU diff有這些選項。同樣,對於其他兩行上的<()運算符,您需要bash或zsh。如果你必須使用其他的shell,你可能需要使用臨時文件。

第一個輸入(忽略的一行)是掌握的「直接」歷史,正如我們在上面發現的;第二個輸入是特徵/新分支的「直接」歷史記錄。命令的輸出是「直接」提交給特性/新分支的所有提交,但不直接掌握「直接」,其中「直接」意味着「不通過合併」。在第二個輸入中包含--first-parent是必要的,以避免在分支功能/新分支之前包含任何合併到主設備中的任何提交,但它將具有排除來自合併到特性/分支中的任何其他分支的提交的副作用,新分支(如果你只需要第一次提交,這並沒有什麼不同)。

輸出是相反的順序,像往常一樣,所以輸出的最後一行是在你們感興趣的問題。

我真的很好奇,想知道你想實現有什麼用信息,因爲它似乎不符合Git的世界模型。 Git用戶知道並期望分支的歷史包括分支祖先的歷史和任何合併到其中的歷史。

+0

成功!這個命令給出的最後一個修訂版本就是我以前的版本。爲了回答你的問題,我想要什麼,我試圖建立一個我的git歷史的視圖,告訴我創建分支的日期。 Git不直接存儲這些信息,所以我能得到的最接近的是分支上的第一次提交。我可能在我第一次承諾之前創建了分支機構的日子,但我正在考慮這個邊緣案例。 – Dave