【问题标题】:git merge ignores deleted files, existing on merged branch (renamed files)git merge 忽略合并分支上存在的已删除文件(重命名文件)
【发布时间】:2012-10-12 04:42:43
【问题描述】:

我有分支 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%)
Another discussion 建议“手动合并”将文件从一个分支复制到另一个分支。

更新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 无法识别为重命名的文件列表并诉诸手动​​合并。

【问题讨论】:

  • 您是否尝试过在 master 之上重新设置 feature1,而不是将 master 合并到 feature1 中?
  • 我做到了。得到了相同的效果,但不同的文件被“遗忘”。我最终手动合并了那些被删除和重命名的文件。
  • 这很有趣;这似乎正是 rebase 可以很好地处理的情况类型。您可能会尝试弄乱合并策略,但我不确定您问题的根源。 kernel.org/pub/software/scm/git/docs/git-merge.html(合并策略部分)
  • 也许这里的解决方案会有所帮助:: stackoverflow.com/questions/4722423/…
  • 如何删除受版本控制的文件? git rm 将帮助管理这些事情并做正确的事情。如果是一个动作,那么 git mv 会做正确的事情。当然,您仍然需要对它们进行上演。关于您的第三次更新,不要忘记您可以直接从其他分支或存储库签出文件。这可能有助于您恢复这些文件。

标签: git merge


【解决方案1】:

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

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

【讨论】:

  • 原来是这个问题。如 upd1 中所述,我在 feature1 分支中删除了一些文件,并合并了 master,git 识别出它是同一个文件,因此跳过了它(因为它认为这个文件不应该出现在 feature1完全分支。
【解决方案2】:

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

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

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

参见Matt McCutchen (mattmccutchen)commit b26d87f(2017 年 1 月 28 日)。
(由 Junio C Hamano -- gitster -- 合并于 commit 74aabf4,2017 年 2 月 27 日)

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

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. rename),通过合并 o->branch1 有更改并且 o->branch2 有删除的情况 情况正好相反。

【讨论】:

    猜你喜欢
    • 2012-07-05
    • 2016-04-04
    • 1970-01-01
    • 2013-10-17
    • 2013-12-05
    • 2011-02-12
    • 2020-11-13
    • 2018-02-28
    • 1970-01-01
    相关资源
    最近更新 更多