我正在尝试使用git log
来查找特定文件何时被置于主文件中。
(简化版)历史记录如下所示:
* 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
我真的很难过,非常感谢任何指针。
答案 0 :(得分: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)
答案 1 :(得分:0)
您可以在这里做的最好的事情是使用 git blame
或git bisect
来查找包含更改的第一个提交,然后按照子提交链查找第一个合并提交
Git并没有真正拥有属于分支的某些提交的概念。是的,提交包含在分支中,并且可能包含也可能不包含在一个分支中。你要做的就是要记录每个提交所在的分支。这是Mercurial所做的,但不是Git。
稍微阅读您的问题,您可能不需要以自动方式执行此操作。在这种情况下,您只需查看git log --sparse -- foo
不同之处在于--sparse
将列出所有走过的父母,并且它将首先走向具有完全相同内容的父母(在这种情况下,是合并的右侧)。