在Mac OS X上,我有两个分支 - 比如A和B - 我想将A合并到B.当我尝试在B上做git merge A
时,我得到:
error: Untracked working tree file 'path/file.php' would be overwritten by merge. Aborting
这是因为A中的某些更改重命名了文件 - 即B有文件path/File.php
而A已将其重命名为path/file.php
。由于Mac OS X文件系统不区分大小写,因此可能会混淆git。有没有办法让git正确合并?
更新:为了澄清,分支B没有任何未提交的更改,并且在两个分支中跟踪有问题的文件(当然,在不同的名称下)。
答案 0 :(得分:4)
好的,经过一整天的挖掘,这是我找到的解决方案:
==========情况==========
我正在开发我的分支“Hotdog”
我的同事将他的工作推到了我们的主分支,包括一个名为“Hamburgersrule”的文件
我将master合并到我的Hotdog分支中。
我的同事将“Hamburgersrule”更改为“HamburgersRule”,并将其推向掌握。
==========问题==========
当我尝试在Hotdog和Master之间切换时,Git认为发生了一些变化。 HamburgersRule的情况与Git看起来不同,但是Windows认为它很好。每当我尝试合并或结帐另一个分支时,Git警告我,我将丢失未分级的文件。
我可以通过将git config core.ignorecase设置为true来抑制该消息,但是潜在的问题仍然存在,忽略大小写差异就是让我们首先陷入困境的原因。
==========解决方案==========
1:对Master进行三重重命名(以确保新文件名正确) 汉堡规则 - > HamburgersRule_Rename - > HamburgersRule
2:将更改合并到Hotdog Branch。要使合并工作,您需要删除您的“Hamburgersrule”版本(使用您的操作系统,而不是git)
3:清除Hotdog上的剩余文件。检查合并是否按预期工作。您可能需要从Master分支机构查看HamburgersRule:
git checkout master HamburgersRule
编辑: 重要的提示。如果您不想一遍又一遍地修复此问题,请确保您的同事都将ignorecase设置为false
git config core.ignorecase false
如果有人忽略区分大小写,他们的git客户端将忽略这些更改,并继续检查错误名称。
答案 1 :(得分:3)
启动git 2。0。1(2014年6月25日),该合并将不再失败。
commit ae352c7f37ef2098e03ee86bc7fd75b210b17683
见David Turner (dturner-tw
)
merge-recursive.c
:修复案例更改合并错误在不区分大小写的文件系统上,合并时,如果传入的提交已重命名,只会更改其大小写,则会从工作树中错误地删除该文件。
合并重命名时,将删除具有旧名称的文件 - 但由于文件系统认为旧名称与新名称相同,因此新文件实际上将被删除。我们通过不删除在阶段0的索引中具有案例克隆的文件来避免这种情况。
答案 2 :(得分:2)
也许对另一个问题的这个答案会有所帮助;您可能只想暂时启用该选项...
答案 3 :(得分:0)
如果您在git mv path/File.php path/file.php
上B
怎么办?这应该让git知道它是具有不同名称的同一文件。