代码之家  ›  专栏  ›  技术社区  ›  x-yuri

`git-log-ppath/to/file`不显示所有更改[重复]

  •  2
  • x-yuri  · 技术社区  · 8 年前

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

    更新 我能够在测试回购中复制我的特定问题:

    #!/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
    

    提交 b11 b12 未在最后一个命令中列出。

    3 回复  |  直到 8 年前
        1
  •  4
  •   Community THelper    7 年前

    使用 git log -m -p 。您可能还需要添加 --follow 如果您希望跟踪重命名( --跟随 代码非常杂乱,只适用于某些情况,我不知道如果在合并中出现重命名点,它会如何表现)。

    默认情况下, git log -p 对于合并提交没有显示任何内容,即使您请求特定路径也是如此。这个 -m 旗子有效地告诉我们 git log 将每个合并提交拆分为两个 1. 虚拟提交,每个父级一次。然后,它显示每个父对象的更改,此时您将看到指定路径的更改。

    (注:使用 git show 默认情况下,onmerge提交将显示组合的diff,包括查看特定路径时。组合的diff将抑制与两个/所有父项相比没有更改的文件,因此 -米 在这里也可能有用。)

    DavidN's answer 注释,添加 --all (或 --branches , --tags 、和/或 --remotes )如果您想查看所有引用(或所有分支、所有标记等)。

    对于特别复杂的情况,请参见 git for-each-ref ,它可以生成ref名称,您可以对其进行筛选,然后将其传递给 git日志 命令


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

        2
  •  1
  •   David Neiss    8 年前

    扔进一面全旗? git log --all filePath 默认情况下,日志只从当前分支返回。您可以在命令中列出所有分支名称 git log branch1 branch2 -- filePath --all flag考虑所有可能的分支。

        3
  •  0
  •   x-yuri    8 年前

    所以,我基本上或多或少地回答了我的问题,试图在测试报告中重现这个问题。在我的例子中,当特征分支更改文件,然后将其恢复到原来的状态时,就会发生这种情况。也就是说,当合并作为一个整体不会对文件进行更改时。然而,不知道为什么会发生这种情况。但这一定与 history simplification 事情