`git log -p path / to / file`不显示所有更改

时间:2016-05-26 15:28:20

标签: git git-log

我希望它能显示指定文件的所有更改(提交),但它不会这样做。它只显示了其中的一部分。我想它与合并有关,但我不知道这里可能出现什么问题。有人可以解释一下吗?

UPD 我能够在测试回购中重现我的特定问题:

#!/usr/bin/env bash
set -eu
rm -rf 1
mkdir 1 && cd 1
git init

mkdir 1
echo m1 > 1/m1 && git add 1/m1 && git commit -m m1

git co -b b1
echo m11 > 1/m1 && git add 1/m1 && git commit -m b11
echo m1 > 1/m1 && git add 1/m1 && git commit -m b12

git checkout master
echo m2 > m2 && git add m2 && git commit -m m2
git merge b1 -m 'merge b1'
git --no-pager log --graph --oneline --decorate --all
git --no-pager log --oneline 1

最后一个命令未列出提交b11b12

3 个答案:

答案 0 :(得分:4)

使用package.json。如果您想要跟踪重命名,您可能还想添加git log -m -p--follow代码非常hacky并且仅适用于某些情况,并且我不知道如果重命名点出现在合并)。

默认情况下,即使您要求特定路径,--follow也不会显示任何合并提交。 git log -p标志有效地告诉-m将每个合并提交分成两个 1 虚拟提交,一个针对每个父提交。然后它会显示针对每个父项的更改,此时您将看到对指定路径的更改。

(注意:在合并提交中使用git log默认情况下会显示组合差异,包括查看特定路径时。组合差异会抑制没有更改的文件与两个/所有父级相比,所以{{ 1}}在这里也可能有用。)

DavidN's answer所述,如果您想查看所有引用,请添加git show(或-m--all和/或--branches)所有分支,所有标签等。)。

对于特别复杂的情况,请参阅--tags,它可以生成可以过滤的引用名称,然后传递给--remotes命令。

1 假设合并只有两个父项 - 如果有更多,则合并将分为 N 有效提交,即 N 这样的虚拟提交。您可以通过其提交ID不再是正常的SHA-1哈希来识别每个虚拟提交。相反,它是一对哈希:合并的ID后跟特定的父级。

答案 1 :(得分:1)

投入 - 所有标志? git log branch1 branch2 -- filePath默认情况下,log仅跟随当前分支。您可以在命令--all上列出所有分支名称,或者d3.json() {}标志列出所有可能的分支。

答案 2 :(得分:0)

所以,我基本上或多或少回答了我的问题,试图在测试回购中重现这个问题。在我的情况下,它发生在比较分支更改文件,然后将其恢复到它所处的状态时。也就是说,当合并作为一个整体不会对文件引入更改时。但不确定为什么会这样。但它必须与history simplification事物有关。