代码之家  ›  专栏  ›  技术社区  ›  kelvin

git diff——检查显示不相关分支/文件的更改

  •  2
  • kelvin  · 技术社区  · 7 年前

    背景

    我试图查看当前分支的空白错误(忽略 在EOL)。大多数文件使用 慢性淋巴细胞白血病 我没有 核心空白 配置集。

    这是原始命令:

    git -c core.whitespace=trailing-space,cr-at-eol diff --check master..HEAD
    

    引用在旧版本上创建的分支 主人 (“ 老爷 “”。

    问题是 git diff --check 以一种意想不到的方式行事:它是 不仅显示错误 主…头 但也有错误 老主人..主人 .

    问题

    • 这是因为 git diff—检查 比较中的整个快照 给定的修订范围?

    • 为什么 git log git diff 在这种情况下表现不同?

    • 不应该 git diff—检查 只比较已更改的行中的已更改行 文件夹?

    主人 VS 老爷 (数字一致):

    $ git log --oneline oldmaster..master | wc -l
    115
    
    $ git diff --name-only oldmaster..master | wc -l
    115
    

    这正确地显示了相关承诺:

    $ git log --oneline master..HEAD | wc -l
    4
    

    这将显示正确的文件:

    $ git log --oneline --name-only master..HEAD -- | grep -E '^[a-zA-Z]+/' \
      | sort -u | wc -l
    4
    

    出于某种原因,这些文件还包括 老主人..主人 :

    $ git diff --name-only master..HEAD -- | wc -l
    119
    
    $ git -c core.whitespace=trailing-space,cr-at-eol diff --name-only \
      master..HEAD -- | wc -l
    119
    

    这两个都显示了不相关的文件:

    $ git diff --check master..HEAD -- | grep -E '^[a-zA-Z]+/' | cut -d : -f 1 \
      | sort -u | wc -l
    30
    
    $ git -c core.whitespace=trailing-space,cr-at-eol diff --check master..HEAD \
      -- | grep -E '^[a-zA-Z]+/' | cut -d : -f 1 | sort -u | wc -l
    9
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   torek    7 年前

    除了组合差分(此处不使用)之外, git diff 严格比较两个 快照 . 使用的语法 git diff A B VS git diff A..B _Git提取快照A,提取快照B,并比较这两个快照。您使用的任何标志选项,例如 --check ,应用于此特定比较。提交 A 不必是…的祖先 B 反之亦然;Git不查看这两个提交之间的任何提交;它只是提取 然后提取 和那些不同。

    这个 git log 命令做了一些非常不同的事情:它 浏览修订图 . 鉴于 git log A..B ,Git查找所有提交 那不是 可到达的 Think Like (a) Git .

    注意使用时 -p 具有 GIT日志 要将提交视为修补程序, GIT日志 将每个提交与它的(单个)父级进行比较。如果在 A..B 例如,范围, git log -p A..B 第一次演出 git diff B^ B B^ 并运行 git diff B^^ B^ 最后一场演出 B^^ 并运行 git diff B^^^ B^^ . (这假设范围内没有合并提交,但是 GIT日志 默认情况下忽略合并提交的修补程序。)


    要查看组合差异,请使用 git show 在合并提交时。这个 差异比较 命令还将生成具有某些特定参数的组合diff,有时不正确:特别是 -点语法, git diff A...B ,用于比较 提交 但有时会做一些不同的事情。另外,当您使用索引并且该索引包含冲突合并时, 差异比较 将产生组合差异。

    从技术上讲,它甚至不需要提取这两个快照,它只是直接从树对象中工作。为了计算差异,它必须提取不同的斑点。对于相同的斑点, 差异比较 知道它们是相同的,因为它们的散列ID匹配。但这很容易解释为“提取和比较”。

    推荐文章