显示所有分支的单个文件的历史记录

时间:2014-07-21 22:50:00

标签: git git-log

如何在Git中显示单个文件的完整历史记录?当我使用git log <filename>gitk <filename>时,我只会进行合并。我想看看影响文件的合并分支的提交。我已尝试过--follow和其他旗帜,但无法找到方法。

2 个答案:

答案 0 :(得分:3)

这将显示文件的所有版本(合并与否):

gitk --all <filename>

答案 1 :(得分:2)

TL; DR摘要:--all

首先,让我解决一个适用于许多git命令的常规项目。

git log查看您指定的修订版,使用git rev-list来处理它们。您通常会看到许多提交的原因是git rev-list&#34;走历史&#34;,除非告知不要:

$ git rev-list --no-walk HEAD
d1574b852963482d4b482992ad6343691082412f
$ git rev-list HEAD
d1574b852963482d4b482992ad6343691082412f
b9491ea160d12ddfd69a9ddc79ebd264cda20679
676699a0e0cdfd97521f3524c763222f1c30a094
[snip]

但是,git rev-list 访问的修订从您指定的点开始(默认值为HEAD)。因此,任何已经包含您指定的点或其历史记录的修订都将被省略:

        C - D           <-- branchA
      /
A - B - E - F - G       <-- branchB
      \
        H - I - J - M   <-- HEAD=branchC
          \       /
            K - L

在此图表中,我输入了三个分支名称,并显示HEADbranchC。每个单个字母代表一个提交(SHA-1)。任何提交的父母都是左边的父母,可以直接离开,也可以沿着提交之间的父提交链接向上或向下移动。

此时,git log会向您显示提交MLKJI,{{1} },HB,因为A(和git log)将从git rev-list开始并向后走。 (这些提交的准确顺序取决于其他参数。)

另一方面,HEAD会向您显示提交git log branchBGFEB,因为在提交A并向后走时选择那些提交(而不是其他提交)。同样,Ggit log branchA开头,然后返回D

如果您要求A查看git rev-list,则会从所有引用开始(所有分支,所有标记,所有远程分支以及所有其他引用) --all命名空间)并向后走。在这种情况下,单独的所有分支都足以选择每个提交。在包含标记的存储库中,refs/可能会使您小于--branches,因为可能会有一些标记但未标记分支的行。请参阅(相当压倒性的)git rev-list documentation以查看此处的所有可用选项。


将文件名添加到--all会使其跳过其访问的某些(许多或大多数)提交的打印,通过文档中描述的{{3} }。也就是说,git log首先选择您的git log参数选择的所有提交,但只有显示更小的数字。

添加git rev-list会使--follow尝试注意到在特定提交中重命名文件的情况,并且在这些情况下,一旦转换到此类提交,就将所选修订转换为具有先前名称的修订它的历史 - 走路。换句话说,它会尝试调整历史记录简化以更正名称更改。此重命名发现是动态执行的(为每对提交重新测试)。它仅在向后退步时才起作用 - 代码不在那里处理其他提交命令。

使用git log时,您可以更好地控制被识别为重命名的内容;使用git diff&#39; git log,你仍然坚持50%匹配的编译默认值。