假设我的项目有两个分支:stable和master。
在master分支中,不久前,我已经手动移动了一些文件,遗憾的是没有使用git mv
命令,而是手动移动,因此看起来git没有标记此移动(尽管通常会这样)。
现在我遇到的问题是,每次我对这些文件的稳定分支进行一些更改,并且我想将这些更改合并回master,它总是告诉我这些更改是全新的文件,它不会只是显示更改,使合并变得非常困难,不仅因为我现在必须合并这些文件,而且因为这些文件往往会转移,所以事情日复一日变得更加怪异。
现在可以通知git这两个文件实际上是相同的并且只显示差异,就像我在第一时间执行git mv
一样吗?
答案 0 :(得分:1)
作为LightBender commented,Git 重命名检测而不是重命名跟踪。在Git 2.9或更高版本中,默认情况下对普通git diff
启用此检测,但如果您的Git较早或者您需要降低重命名检测阈值,则可以指定-M
选项,加上一个"相似性指数"号。
您还可以使用-X find-renames=<number>
指定合并时使用的特定相似性索引(两个命令中的数字形式相同,50
的默认值相同&#34; 50%类似&#34;。)
请注意,您确实应该将两个分支提示的合并基础与每个提示进行比较,以查看检测到的重命名内容。只有当一个尖端与合并基础足够相似时才比较两个提示就足够了。作为一个简化示例,假设某些基本文件完整地读取:
alfa_
bravo
charl
delta
echo_
(我已经制作了5行相同的长度,以便百分比很好地工作)。
在分支X中,同一个文件显示为:
foxtr
golf_
charl
delta
echo_
在分支Y中,文件显示为:
alfa_
bravo
charl
hotel
india
并且在两个分支之一中,文件也被重命名(从&#34;飞行员字母表&#34;到"NATO phonetic alphabet",也许):
...--B--o--...--L <-- branch_X
\
o--...--R <-- branch_Y
此处,commit B
是合并基础,原始文件的原始名称。将它与分支X中的L
进行比较,它的相同之处为60%:五条线中有两条发生了变化。将它与分支Y中的R
进行比较,它的60%相同:五条线中不同的两条线发生了变化。所以Git可以匹配这三个文件,即使这三个文件中有一个有不同的名称。
将提交L
与提交R
进行比较,文件只有20%相似:只有charl
(charlie-for-C)行匹配!