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

Git Diff输出中A/和B/对应的提交是什么?[复制品]

  •  1
  • JSBach  · 技术社区  · 6 年前

    我已经使用Git多年了,一直想知道为什么Git diff在修改后的文件名前面加上a/和b/。我本以为最终会偶然发现一个有用的用例,但直到现在,它总是很烦人,从来没有帮助过。

    它对什么有好处?为什么在默认情况下启用?在哪些情况下有用?

    0 回复  |  直到 7 年前
        1
  •  44
  •   VonC    13 年前

    如中所述 diff man page ,a/et b/表示用于区分源和目标的前缀。

    实际上,您可以选择:

    --no-prefix
    

    不显示任何源或目标前缀。

    --src-prefix=<prefix>
    

    显示给定的源前缀而不是“a/”。

    --dst-prefix=<prefix>
    

    显示给定的目标前缀而不是“b/”

        2
  •  27
  •   Will Sheppard    11 年前

    如果您觉得它不有用,可以通过以下方式关闭它:

    git config --global diff.noprefix true
    
        3
  •  13
  •   melpomene    7 年前

    这些目录前缀基本上是为了兼容性而存在的,并被选作一个合理的默认值。解释如下。

    Git之前

    在Git(和其他 VCS )为多个文件创建修补程序的工作流可能是,例如,以下内容:

    • 假设你有一个项目的源代码 asdf 在目录中 asdf-source.latest .
    • 将目录复制到新目录(例如 asdf-source.new 理想地 hard-linking 里面的文件)。
    • 现在您可以在 ASDF源 尝试编译代码、测试代码等。
    • 完成后,使用例如 diff -r asdf-source.latest asdf-source.new >new_feature.patch . 输出也随着时间的推移而变化。除了其他事情之外,Git默认使用“统一”输出,这可能是使用diff获得的 -u 参数。

    现在,您可以看到补丁有使用目录名更改文件的路径。

    然后应用补丁的人(或构建脚本等)将使用 patch 而不是使用 git apply git am . 为了让命令找到正确的文件,必须使用修补程序从路径中删除目录名。 -pN 选项(n显示要删除的目录名和分隔符的数目)。在上述情况下,使用的命令可以是 patch -p1 <new_feature.patch . 这使得补丁创建者可以使用自己的目录名。

    如果遇到脚本使用大量补丁修补某个项目(通常用于 back-ported 例如,Linux发行版中稳定包版本的补丁),补丁的格式可能有所不同。 这个 补丁 命令能够正确地检测这些格式,但是对于路径(要删除多少个目录)来说有点困难。 这方面的一些问题:

    • 强制开发人员使用0目录不是很好。
    • 补丁 查找文件可能很危险(因为它可能会找到其他文件)。

    所以让每个人都发送可以应用的补丁 patch -p1 似乎是最明智的选择。

    回到Git

    在创建Git时,它为这些选项采用了合理的默认值(与大多数项目的提交指南,主要是内核兼容)。因此,您可以使用git并向使用 补丁 应用它,反之亦然(Git能够处理 diff -也创建了补丁)。尤其是以“a”和“b”作为前缀可以节省空间(以及很小的带宽百分比),同时保持一切正常工作。

    你可以设定 git config diff.mnemonicprefix true 为了让Git根据所比较的内容使用不同的前缀(请参见 git help config 更多细节)。

        4
  •  6
  •   manojlds    13 年前

    它是为了区分来源和目的地。您还可以将其更改为更有意义的:

    --SRC前缀= <prefix>

    Show the given source prefix instead of "a/".
    

    --DST前缀= <前缀-gt;

    Show the given destination prefix instead of "b/".
    

    http://git-scm.com/docs/git-diff

        5
  •  4
  •   arush436    8 年前

    如果您想添加 git diff --no-prefix 对你 GITCONFIG 手动添加以下内容:

    [diff]
    noprefix = true