git merge后如何处理xxx~HEAD?

时间:2018-01-11 09:51:53

标签: git git-merge git-merge-conflict

在我的分支A:

我将文件从folder04/config.xml复制到folder05/config.xml,然后复制git addcommit

在我的branchB中(B从A分支出来):

我已经有一个名为folder05/config.xml的文件。

现在我将branchA合并到branchB,这似乎是一个奇怪的冲突。

Untracked files:   (use "git add <file>..." to include in what will be
committed)

    folder05/config.xml~HEAD

它会生成一个名为config.xml~ HEAD 的文件,这意味着什么?

我无法理解为什么,在这种情况下该怎么做?

1 个答案:

答案 0 :(得分:7)

  

它生成一个名为config.xml~HEAD的文件,这意味着什么?

此文件是由git自动生成的,因为您遇到了文件名冲突冲突 - 在两个分支中有两个无关的项目试图占用名称config.xml

这可能是由各种情况引起的:

最有可能,您在分支中创建了名为config.xml的文件。在您要合并的分支中,另一个文件已重命名为 config.xml。由于这两个文件缺少任何共同的祖先,因此无法合并。它们都应该保存在工作目录中,但是存在冲突。因此,他们将保留,但具有唯一的名称。

正在合并的分支中的config.xml 将在磁盘上以config.xml结帐。 您的分支中的config.xml将作为config.xml~HEAD在磁盘上签出。

以下是一个示例,我们在newname.txt分支中添加名为master的文件,并在我们合并的分支中将file.txt重命名为newname.txt。在这种情况下,将引发冲突,我们的分支内容将被写为工作文件夹中的newname.txt~HEAD

% git checkout -bbranch
Switched to a new branch 'branch'

% git mv file.txt newname.txt

% git commit -m"rename file -> newname"
[branch d37e379] rename file -> newname
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename file.txt => newname.txt (100%)

% git checkout master
Switched to branch 'master'

% echo "new file" > newname.txt

% git add newname.txt

% git commit -m"added newname in master"
[master f7bd593] added newname in master
 1 file changed, 1 insertion(+)
 create mode 100644 newname.txt

% git merge branch
CONFLICT (rename/add): Rename file.txt->newname.txt in branch. newname.txt added in HEAD
Adding as newname.txt~HEAD instead
Automatic merge failed; fix conflicts and then commit the result.

一旦您解决了令您满意的冲突并提交了合并,您只需从工作目录中删除~HEAD文件即可。

(最后,请记住git没有跟踪重命名发生,它使用启发式检测重命名。所以这种冲突 - 实际上 - 可能真的是冲突因为文件可能没有重命名 。)