2015-12-08 40 views
2

我想了解git log --all --grep=<>git log --grep=<>之間的區別。我的目標是在搜索時遍歷整個回購。如果我不添加--all,這是否意味着我會錯過分支機構中的所有提交消息?對我來說看起來像一個非直觀的默認值。在整個git repo中搜索提交消息

回答

1

你是對的,你需要--all在這裏(或者你可能想要--branches來代替)。

「直覺」在Git是一個有點棘手,以及git log行爲是直觀的給我,但僅僅是因爲我研究的git以及如何與犯圖表工作以其特有的概念。

log命令與所有其他提交圖遍歷命令並沒有太大區別。它們的工作方式都與 - 實際上很多都是簡單的運行,或者運行,然後使用輸出-git rev-list。您可以給它一些起點提交ID或某些名稱或gitrevisions中描述的任何語法,並且它會從這些ID中找到可達到的每個提交的SHA-1 ID。

承諾,因爲衍合複製操作已經「拋棄」(但仍通過reflogs容易找到),回購協議,包括提交內部,承諾是藏匿棧上,甚至git notes提交,作品這方式,所以git log找不到所有提交。即使是--all標誌也不會實際找到所有提交。

如果你仔細閱讀the git rev-list documentation,你會看到--all指(因此各分公司,所有的標籤和註釋「在refs/每個命名空間參考」,但像ORIG_HEAD沒有特別引用衍合後留下的,也沒有任何引用日誌條目),例如)。同樣的措詞出現在the git log documentation中,但我喜歡將人們推薦給git rev-list,因爲我認爲它最終更具啓發性。

+0

請糾正我,如果我錯了,但它排除合併分支機構?你可以更具體地說明哪些節點根據來自某個提交的git「可達」? – m33lky

+1

「Reachability」是一個圖論法術語,但這個想法很簡單:給定一個開始提交(默認是'HEAD'),圖形漫步者訪問該提交,然後是它的父提交,然後是該提交的父對象,等等上。合併提交只是兩個(或更多)父母的提交,此時圖形漫步者必須訪問這兩個(及其所有父母)。例如參見http://think-like-a-git.net/sections/graph-theory/reachability.html和http://tex.stackexchange.com/a/156501;在後者中,c589395是合併,所以步行者必須訪問9f9c652和b3bd158。 – torek

1

git log是一個遍歷提交圖並打印出提交信息的工具。 --grep是在此遍歷上的過濾器。從當前


git log開始提交(即HEAD),並通過歷史從那裏工作了歸途。

git log --all訪問所有提交。這是非常罕見的,偶爾需要集成商。

--grep是一個過濾器。它過濾了由git log訪問的提交流。僅限過濾器刪除條目,絕不添加。對於每次提交git log訪問--grep決定是否應該包括。如果你把它想象成一個普通的Unix管道,它可能會更有意義。

git log | grep foo 

默認值應該工作最好與最常見的情況。諸如difflog之類的命令最常用於開發。整合發生得非常少。所以默認值是針對開發人員的。

git log對開發人員的常見用途是尋找對此提交作出貢獻的更改。他們正在尋找「爲什麼這是這樣寫的?」這個問題的答案。或者「這個bug從哪裏來的?」。這就是爲什麼默認設置是從當前提交中走過圖。很少有人想要搜索尚未合併到代碼中的提交,這更像是集成管理器的任務。

--grep不會更改提交git log訪問的內容。如果暗示--all,那將是令人驚訝和不靈活的。令人驚訝的是,它會混淆「過濾器」的含義,而且你很少想搜索不相關的分支。不靈活,因爲你如何只搜索某些提交?我想你可能需要一個--no-all來關閉它,然後可能有更多的開關,可能是--branches,以獲得你的意思。

有少數情況下有多個默認行爲,但它通常是一場噩夢。最好有一個牢固的常見用例(開發),而不要猜測更少的情況(集成)。讓罕見的情況明確他們想要什麼。