如何获取“git log--filename”来显示合并提交



我正在尝试使用git log来查找某个特定文件何时进入master。(简化的)版本历史如下所示:

*   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

我想找到哪个提交将文件"foo"引入master(应该是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

在这一点上,我真的很困惑,如果有任何建议,我将不胜感激。

下面是我刚刚发现的:正确的咒语是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)

这里可以做的最好的事情是使用git blamegit bisect来找到包含更改的第一个提交,然后按照子提交链来找到第一个合并提交。

Git实际上并没有特定提交属于分支的概念。是的,提交包含在分支中,可能包含也可能不包含在一个分支中。你要做的是需要记录每个提交都在哪个分支中。这是Mercurial所做的,但Git没有


仔细阅读一下你的问题,你可能不需要以自动化的方式来做这件事。在这种情况下,您只需查看git log --sparse -- foo 提供的提交列表

不同的是,--sparse将列出所有已遍历的父对象,并且它将首先遍历具有完全相同内容的父对象(在本例中,是合并的右侧)。

最新更新