git merge忽略合并分支上存在的已删除文件(重命名文件)

时间:2012-10-22 11:17:34

标签: git merge

我有分支feature1master 然后在feature1中,我将文件dir/file.txt重命名为dir2/file2.txt 之后我改变了master中的文件,一周之后也改变了feature1中的文件。

我在整个项目中更改了40个文件。
当我尝试将 master合并到feature1 时,我使用的是低重命名阈值。 大多数文件都是正确自动合并的。某些文件可用于手动解决冲突。

但是某些具体文件既未出现在merge响应中,也未出现在自动合并中 也没有正确合并。在正确下,我期待我能解决的两个结果中的一个:
1.它无法检测到重命名,只需在dir/file.txt分支中添加另一个feature1 2.它会检测重命名并让我手动解决冲突。

用VB查看时有很多变化 git difftool master:dir/file.txt feature1:dir2/file2.txt

因此我假设git识别重命名并决定保留我的版本 没有告诉我发生了什么。 我该如何解决/调试呢?

这是我使用的命令

git config merge.renameLimit 9999999999
git merge --no-ff -Xrename-threshold=20 -Xignore-space-change master

Upd1

在使用feature1分支时,我删除了dir/file.txt 也许git假定这个文件应该删除,因此忽略它在master中的存在 重命名检测失败,尽管文件的相似性保持不变(levenshtein距离小于内容长度的2%)
Another discussion建议“手动合并”将文件从分支复制到分支。

UPD2

正确解析了其他一些文件 CONFLICT (rename/delete): images/ab.gif deleted in master and renamed in HEAD. Version HEAD of cdn/img/ab.gif left in tree.
已在master中删除并合并到feature1的文件已正确解析。合并时无法识别feature1中删除(或移动)的文件 的建议吗?

Upd3

目前我正试图合并另一种方式。将feature1合并到master并查看哪些文件 正在添加和删除。通过这种方式,我将git fail识别为重命名并采用手动合并的文件列表。

2 个答案:

答案 0 :(得分:1)

如果你要从你的repo中删除文件 - git正在跟踪这个删除,并且在确定要做什么时合并正在考虑这个。

这可能不是你所做的全部,但它是其中的一部分。你可以尝试git再次添加它们。

答案 1 :(得分:0)

  

因此,我认为git会识别重命名并决定保留我的版本而不通知我发生了什么。

Git 2.13(2017年第二季度)实际上会告诉你更多关于发生了什么的事情:

  

" git merge"检测在一个历史记录中重命名的路径,而另一个历史记录被删除(或修改)它,它现在报告两条路径,以帮助用户了解正在合并的两个历史记录中发生了什么

commit b26d87fMatt McCutchen (mattmccutchen)(2017年1月28日) Junio C Hamano -- gitster --于2017年2月27日commit 74aabf4合并)

  

merge-recursive:make" CONFLICT(rename / delete)"消息显示两个路径

     

" git merge-recursive"打印的当前消息用于重命名/删除   冲突是这样的:

CONFLICT (rename/delete): 
new-path deleted in HEAD and renamed in other-branch. 
Version other-branch of new-path left in tree.
  

为了更有帮助,该消息应显示重命名和路径   说明删除发生在旧路径,而不是新路径。所以   将邮件更改为以下格式:

CONFLICT (rename/delete): 
old-path deleted in HEAD and renamed to  new-path in other-branch.  
Version other-branch of new-path left in tree.
  

因为这会使handle_change_delete中的案例数翻倍(修改vs.   重命名),重构代码,通过合并再次将案例数减半   o-> branch1有变化的情况,o-> branch2有删除   相反的情况。