重命名文件后,在分支之间获得有用的 git 差异输出

Getting useful git diff output between branches after a file has been renamed

我正在尝试比较另一个分支中的文件,该文件已重命名。我已使用

将文件重命名回其原始名称
git mv renamed.file original.file
git add -u original.file
git commit 

这在树中看起来是正确的,即它保留了历史。

但是,当我在两个分支中的文件之间执行 git diff 时,我只是获取了所有文件 a 和所有文件 b - 不是非常有用的 diff 输出。

在这种情况下有没有办法获得更细粒度的差异?

我试过:git diff -Cgit diff -Mgit diff --follow -M-M,使用不同的百分比,例如-M10% - 在每种情况下我得到相同的输出

编辑 - 有助于更快解决问题的额外信息: 文件已在 Windows 重命名和编辑,我在 OSX。 (不同的行结尾)。

与其试图说服 git 发生了重命名,不如 "force" 比较两个文件。

我假设您在上次提交时重命名了该文件。

要直接寻址文件 - 即使此文件仅存在于不同的 branch/commit - 您可以使用 <reference>:<path> 语法。利用此语法,diff 命令可能如下所示:

git diff HEAD^:renamed.file original.file

使用此命令,您可以将上一次提交 (HEAD^) 的 renamed.file 与当前 工作树 original.file 进行比较.


您可以查看 git rev-parse 文档以了解有关 <reference>:<path> 语法的详细信息。


还是没有成功?

如果您仍然收到相同的输出,则可能是您更改了空格,这让 git 认为这些行已更改。

在这种情况下,您可以传递 git diff 更多选项来忽略空白更改:

  • --ignore-space-change 或只是 -b 将忽略所有空白更改;或者你可以使用
  • --ignore-space-at-eol 顾名思义,它只会忽略行尾的空格更改

查看 git diff documentation 了解更多详情。

尝试

git cat-file -p COMMIT:path/to/new/location > NEW
git cat-file -p COMMIT~1:path/to/old/location > OLD
diff OLD NEW

看看他们到底有多么不同。

另外,试试 --find-copies-harder 选项