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

7

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

整个项目中有40个文件被这样更改。
当我尝试将master合并到feature1时,我使用了较低的重命名阈值。 大多数文件都会自动正确合并。一些文件需要手动解决冲突。

但是有一些具体的文件既不出现在merge响应中作为自动合并的文件,
也不能正确合并
。在正确的情况下,我期望能够解决以下两种结果之一:
1. 它不会检测到重命名,只会将另一个dir/file.txt添加到feature1分支中。
2. 它将检测到重命名并要求我手动解决冲突。

当我使用
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

更新1

在使用feature1分支时,我删除了dir/file.txt文件。
可能是git认为该文件已被删除,因此忽略了它在master中的存在。
重命名检测失败,尽管文件的相似性保持不变(Levenshtein距离小于内容长度的2%)。
另一种讨论建议进行“手动合并”,将文件从一个分支复制到另一个分支。

更新2

有些其他文件被正确解决了
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中删除(或移动)的文件未被识别出来进行合并。
有什么建议吗?

更新3

目前我正在尝试反过来进行合并。将feature1合并到master中,看看哪些文件被添加和删除。这样我就可以得到一个列表,列出git无法识别重命名的文件,然后进行手动合并。


你尝试过将feature1基于master进行变基(rebase)而不是将master合并到feature1吗? - Steve Goodman
我做了。达到了相同的效果,但是不同的文件被“遗忘”了。最终,我手动合并了那些被删除和重命名的几个文件。 - Alex
有趣的是,这似乎正是rebase擅长处理的情况。你可以尝试调整合并策略,但我不确定你问题的根源在哪里。http://www.kernel.org/pub/software/scm/git/docs/git-merge.html(合并策略部分) - Steve Goodman
也许这里的解决方案可以帮助你:https://dev59.com/F2445IYBdhLWcg3wuspT - Thell
1
你是如何删除版本控制下的文件的?git rm 可以帮助管理这些事情并做正确的事情。如果是移动文件,那么 git mv 将会做正确的事情。当然,你仍然需要将它们暂存。关于你的第三个更新,请不要忘记你可以直接从其他分支或存储库中检出文件。这可能有助于恢复这些文件。 - vgoff
所有文件都有共同的祖先吗?我还想知道您是否使用git rm和git mv? - Michael
2个回答

1

如果您从仓库中删除文件- git将跟踪此删除,并在确定要执行的操作时考虑此内容。

这可能不是您所有的问题,但它是其中的一部分。您可以尝试再次添加git。


那就是问题所在。正如在更新1中所指出的,我在feature1分支中删除了一些文件,当合并master时,git识别到它是相同的文件,因此跳过了它(因为它认为这个文件根本不应该出现在feature1分支中)。 - Alex

0
因此,我认为git识别到了重命名并决定保留我的版本,而没有告诉我正在发生什么事情。
Git 2.13(2017年第二季度)实际上会告诉您更多关于正在发生的事情:
当“git merge”检测到一个路径在一个历史中被重命名,而另一个历史中删除(或修改)它时,“它现在报告两个路径以帮助用户理解正在合并的两个历史中正在发生的事情”。

查看提交 b26d87f(2017年1月28日)由Matt McCutchen (mattmccutchen)完成。
(由Junio C Hamano -- gitster --提交 74aabf4中合并,2017年2月27日)

merge-recursive:使“CONFLICT(重命名/删除)”消息显示两个路径

当前由“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 具有删除的情况与另一种情况相结合,将情况数量减半,进行代码重构。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接