【问题标题】:diff returning entire file for identical filesdiff 返回相同文件的整个文件
【发布时间】:2026-01-24 04:00:02
【问题描述】:

我有一个有 git 存储库的网站。我克隆了 repo,以便我可以在一个目录中开发,然后推送到 repo,然后拉入 live/prod 目录(如果有更好的方法,我会对建议感兴趣,但那不在这个问题的范围)。

我在 live 目录中执行了以下操作来推送我所有的最新更改:

git add .
git commit -a // added a message
git push

然后我在 dev 目录中做了以下操作:

git clone git@bitbucket.org:user/repo.git

然后我打开了两个文件,prod/root/test.php 和 dev/root/test.php,它们看起来一模一样。但是,当我执行以下 diff 命令时,它输出了整个文件:

diff prod/root/test.php dev/root/test.php

我很困惑为什么 diff 会输出整个文件,如果它们是相同的......我也试过用谷歌搜索,但找不到其他人有这个问题。也许是行尾问题或字符编码问题,它们看起来相同但实际上不同,当您推送到他们的仓库时 git/bitbucket 会转换它?这是我唯一能想到的......要么就是这样,要么我错过了一些非常明显的东西。

这是输出:

1,3c1,3
< <?
< echo '<p>Hello world!</p>';
< ?>
---
> <?
> echo '<p>Hello world!</p>';
> ?>

【问题讨论】:

    标签: git diff


    【解决方案1】:

    这似乎是一个空格问题,为了以后避免它们,您可以设置 Git 来规范它们。

    Windows 和 UNIX 系统不使用相同的行尾,为了防止基于这些的冲突发生,你应该这样设置你的 git config:

    • Windowsgit config --global core.autocrlf true
    • Unixgit config --global core.autocrlf input

    接下来,为了确保我们只提交理想的空白规则,您可以设置此config option

    git config --global core.whitespace trailing-space,space-before-tab,indent-with-non-tab
    

    【讨论】:

    【解决方案2】:

    很可能是线路终止。试试git diff --ignore-space-at-eol。对于普通(不是git)差异,它是diff -b

    【讨论】:

      【解决方案3】:

      这通常意味着行尾不同。大多数差异程序允许您忽略行尾的差异。你的允许你这样做吗?

      【讨论】:

        【解决方案4】:

        不是解决方案,对你有帮助。

        git diff --no-ext-diff --ignore-space-change -- &lt;path&gt; -> git bash 中只能查看代码更改。

        【讨论】:

          【解决方案5】:

          扩展@SimonBoudrias 的出色答案git config --global core.autocrlf true ask 的 git 以在结帐时将行尾从 LF 转换为 CRLF。对于在 Windows 上工作的开发人员非常有用。此命令会将以下内容添加到%HOMEPATH%\.gitconfig

          [core]
              autocrlf = true
          

          最好从Git Bash 运行命令,但如果您觉得更容易,可以手动将以上行添加到.gitconfig

          【讨论】: