0

我试图用来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。在更复杂的情况下,对分支 1 和分支 2 上的文件 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

在这一点上我真的很难过,非常感谢任何指点。

4

2 回答 2

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)

于 2012-07-16T21:42:30.013 回答
0

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

Git 并没有真正属于分支的某些提交的概念。是的,提交包含在分支中,可能只包含也可能不包含在一个分支中。您正在尝试做的事情需要记录每个提交所在的分支。这是 Mercurial 所做的事情,但不是 Git。


稍微阅读一下您的问题,您可能不需要以自动方式执行此操作。在这种情况下,您只需查看由git log --sparse -- foo

不同之处在于--sparse它将列出所有已行走的父母,并且它将首先行走具有完全相同内容的父母(在这种情况下,合并的右侧)。

于 2012-07-13T23:56:54.940 回答