2012-07-13 52 views
0

我試圖使用git log來找到何時將特定文件帶入主文件。 (簡化)版本歷史是這樣的:如何讓`git log - filename`向我展示合併提交

* f77cac3 Merge branch 'branch2' 
|\ 
| * da35250 Merge branch 'branch1' into branch2 
| |\ 
| | * 90ab3e3 adding foo on branch1 
| * | 42a0367 adding bar in branch2 
| |/ 
* | 853b691 changes to baz on master 
* | c7b6c72 baz file on master 
|/ 
* e195580 first commit 

我想找到其呈交介紹了文件「富」到主(應該是f77cac3)。然而,運行git log --foo給出90ab3e3。在更復雜的情況下,如果對branch1和branch2上的foo文件進行了多項更改,則所有這些提交都將顯示出來,而不是合併提交。我已經閱讀了git的幫助,以及在Stack Overflow上搜索和搜索,但我找不到一種方法來做到這一點。

這裏是你可以用它來重新創建以下情形的命令:

mkdir testgit 
cd testgit 
git init 
vim README 
git add README 
git commit 
git checkout -b branch1 
vim foo 
git add foo 
git commit 
git checkout master 
git checkout -b branch2 
vim bar 
git add bar 
git commit 
git checkout master 
vim baz 
git add baz 
git commit 
vim baz 
git add baz 
git commit 
git checkout branch2 
git merge --no-ff branch1 
git checkout master 
git merge --no-ff branch2 

我在這一點上確實難住了,真的很感激任何指針。

+0

奇怪的是,我正要提示'git log --merges - foo',但它沒有在樣本庫上顯示任何東西(我在這裏有Git 1.7.10.4)。 – kostix 2012-07-15 16:01:25

回答

0

你可以在這裏做的最好的是用git blamegit bisect找到第一次提交包含的變化,然後按照孩子的連鎖承諾找到的第一個合併提交。

Git並沒有真正的屬於分支的某些提交的概念。是的,提交包含在分支機構中,並且可能包含或不包含在一個分支中。你要做的事情需要記錄每個提交的分支。這是Mercurial所做的,但不是Git。


讀一下你的問題,你可能不需要以自動的方式做到這一點。在這種情況下,你可以看看由git log --sparse -- foo

不同的是,--sparse將列出所有的家長走到提供的提交的列表,它會走誰具有完全相同的內容,第一個(在這種情況下父母,合併的右側)。

+0

花了我一些時間來記住爲什麼我最初決定這種方法不起作用,當我第一次嘗試它。問題是,'git log --sparse'會顯示** all **提交。 ' - foo'沒有效果。如果在我感興趣的合併之後,我有更多的提交對象,那麼我仍然需要一種方法來確定我正在尋找的提交。 – 2012-07-16 16:33:07

1

所以這是我剛剛想通了: 正確的咒語是git log --first-parent -- foo,但是,只有當你的Git版本是1.7.9.1或以上的工作,因爲該版本--first-parent被打破之前。唉,當我遇到這個問題時,我使用的是舊版本,並在1.7.9.1的發行說明中發現了修復的提及(https://github.com/git/git/blob/master/Documentation/RelNotes /1.7.9.1.txt)

相關問題