重新附加从git中的另一个分支移动文件

时间:2017-09-19 11:35:23

标签: git

假设我的项目有两个分支:stable和master。 在master分支中,不久前,我已经手动移动了一些文件,遗憾的是没有使用git mv命令,而是手动移动,因此看起来git没有标记此移动(尽管通常会这样)。

现在我遇到的问题是,每次我对这些文件的稳定分支进行一些更改,并且我想将这些更改合并回master,它总是告诉我这些更改是全新的文件,它不会只是显示更改,使合并变得非常困难,不仅因为我现在必须合并这些文件,而且因为这些文件往往会转移,所以事情日复一日变得更加怪异。

现在可以通知git这两个文件实际上是相同的并且只显示差异,就像我在第一时间执行git mv一样吗?

1 个答案:

答案 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)行匹配!