git合并后如何处理xxx~HEAD?

How to deal with xxx~HEAD after git merge?

在我的分支A:

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

在我的分支B(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的文件,什么意思?

我不明白为什么,在这种情况下我该怎么办?

It generates a file named config.xml~HEAD, what does it means?

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

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

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

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

在磁盘上检出

这是一个示例,我们在 master 分支中添加一个名为 newname.txt 的文件,并在我们要合并的分支中将 file.txt 重命名为 newname.txt in. 这样会引发冲突,我们分支的内容会在工作文件夹中写成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 不会 跟踪 重命名的发生,它使用启发式方法来检测重命名。所以这种冲突 - 在实践中 - 可能不会 really 是一个冲突,因为文件可能没有 really 重命名。)