我如何修复由于删除分支中的文件而导致的合并冲突?

我已经创建了一个dialog分支,当我尝试将它合并到master分支时。有两个冲突。我不知道如何解决CONFLICT (delete/modify)。你能告诉我该怎么办吗?

$ git checkout master
$ git merge dialog
CONFLICT (delete/modify): res/layout/dialog_item.xml deleted in dialog and modified in HEAD. Version HEAD of res/layout/dialog_item.xml left in tree.
Auto-merging src/com/DialogAdapter.java
CONFLICT (content): Merge conflict in src/DialogAdapter.java
Automatic merge failed; fix conflicts and then commit the result.

我已经打开src/DialogAdapter.java,修复了冲突,并做了一个git add src/DialogAdapter.java。我还需要做什么?

260130 次浏览

冲突信息:

CONFLICT (delete/modify): res/layout/dialog_item.xml deleted in dialog and modified in HEAD

这意味着res/layout/dialog_item.xml在你要合并的'dialog'分支中被删除了,但在HEAD(在你要合并到的分支中)中被修改了。

所以你必须决定是否

  • 使用"git rm res/layout/dialog_item.xml"删除文件

  • 使用"git add res/layout/dialog_item.xml"接受HEAD中的版本(可能是在编辑后)

然后使用"git commit"完成合并。

注意,git会警告你,你正在创建一个合并提交,在(罕见的)情况下,它是你不想要的。可能是在这种情况不那么罕见的年代留下的。

如果你在windows上使用Git Gui,

  1. 终止合并
  2. 确保您在目标分支上
  3. 从资源管理器中删除冲突文件
  4. 重新扫描Git Gui中的更改(F5)
  5. 注意,冲突的文件被删除了
  6. 从Commit菜单中选择Stage changes Files To Commit (Ctrl-I)
  7. 输入一个类似“删除冲突文件”的提交注释
  8. 提交(按ctrl enter)
  9. 现在如果你重新启动合并,它将(希望)工作。

我通常只运行git mergetool,它会提示我是否要保留修改过的文件或删除它。这是最快的方法,因为它是一个命令,而不是每个文件几个。

如果你在一个特定的子目录下有一堆被删除的文件,你想要通过删除这些文件来解析它们,你可以这样做:

yes d | git mergetool -- the/subdirectory

d用于选择删除每个文件。你也可以使用m来保存修改后的文件。从运行mergetool时看到的提示符中获取:

Use (m)odified or (d)eleted file, or (a)bort?

你有两个冲突:

  • res/layout/dialog_item.xml在一个分支中被更改,在另一个分支中被删除
  • src/DialogAdapter.java在两个分支中都被改变了

第二个问题你解决了。剩下的是决定是否要删除res/layout/dialog_item.xml或离开。在第一种情况下你git rm它,在第二种情况下git add。然后执行git commit

再现冲突:

mkdir a
cd a
git init
echo a > a && echo b > b && git add . && git commit -m c1
git checkout -b f
echo af > a && rm b && git add -A && git commit -m cf
git checkout master
echo am > a && echo bm > b && git add -A && git commit -m cm
git merge f || true