3

我在 git 中有一个提交,它移动了很多文件(Git 识别这些是移动/重命名),然后在对其中一些文件进行了重大修改后再次提交。

一切都在单个提交的基础上按预期显示,但是当我将旧提交与分支上的最新提交进行比较时,git 将其中一些文件显示为已删除然后添加。

如果我执行以下命令,git 会正确地看到重命名和修改:

git log --follow --name-status -M  branch  -- */fileName

如果我执行以下操作:

git diff --follow -M  branch -- */fileName

Git 告诉我整个文件被删除然后重新添加(红色和绿色文本)。

我认为正在发生的事情是,在进行 diff 时,git 不会遍历其间的所有提交,而是将第一个提交内容直接与最后一个提交内容进行比较,并且由于文件在一次提交中发生了重大变化,因此不被视为对原始文件的修改.

有没有办法在不明确列出文件的旧路径和新路径到 git 的情况下获得仅更改内容的正确差异?

4

1 回答 1

0

由于git实际上并不跟踪文件移动/重命名,而是按需检测它们,git因此并不真正“知道”这一点,例如文件a变成了some/subdir/z. -M选项(和其他一些) to和diff其他一些命令允许指定用于确定文件相似性的阈值,例如,如果两者之间至少有 25% 的相似性,git diff -M25% a some/subdir/z则将考虑some/subdir/z是移动然后修改它的结果a. 当然,设置较低的阈值也可能会错误地“识别”一堆其他重命名-编辑对,因此请谨慎使用...

于 2013-06-24T16:36:40.687 回答