我已经创建了一个对话框分支,当我试图合并到主分支。有两个冲突。我不知道如何解决冲突(删除/修改)。你能告诉我该怎么办吗?

$ 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添加src/DialogAdapter.java。我还需要做什么?


冲突信息:

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”删除文件

or

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

然后你用“git commit”完成合并。

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


如果你在windows上使用Git Gui,

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


我通常只运行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或离开。在第一种情况下你使用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