7

我有树枝feature1master.
然后在feature1我将一个文件重命名dir/file.txtdir2/file2.txt.
之后我修改了文件,master一周后feature1也修改了文件。

我在整个项目中更改了 40 个文件。
当我尝试合并时masterfeature1我使用的是低重命名阈值。大多数文件都已正确自动合并。提供一些文件用于手动解决冲突。

但是一些具体的文件既不会在merge响应中显示为自动合并,
也不会正确合并
。在适当的情况下,我希望我可以解决以下两种结果之一:
1.它不会检测到重命名,只是将另一个添加dir/file.txtfeature1分支中。
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

目前我正试图以相反的方式合并。合并feature1master查看正在添加和删除哪些文件。这样,我将列出 git 无法识别为重命名并诉诸手动​​合并的文件列表。

4

2 回答 2

1

如果您正在从您的存储库中删除文件 - git 正在跟踪此删除,并且合并在确定要做什么时正在考虑这一点。

这可能不是您所做的全部,但它是其中的一部分。您可以再次尝试 git add'ing 它们。

于 2012-11-15T01:53:27.287 回答
0

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

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

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

请参阅Matt McCutchen ( )的提交 b26d87f(2017 年 1 月 28 日) 。(由Junio C Hamano 合并 -- --74aabf4 提交中,2017 年 2 月 27 日)mattmccutchen
gitster

合并递归:使“冲突(重命名/删除)”消息显示两个路径

当前由“ 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.

To be more helpful, the message should show both paths of the rename and state that the deletion occurred at the old path, not the new path. So change the message to the following format:

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.

Since this doubles the number of cases in handle_change_delete (modify vs. rename), refactor the code to halve the number of cases again by merging the cases where o->branch1 has the change and o->branch2 has the delete with the cases that are the other way around.

于 2017-03-27T21:10:48.260 回答