如何在Git合并后处理xxx~HEAD?

6

在我的分支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的文件,这是什么意思?
我不理解为什么会这样,以及在这种情况下我该怎么做?

我无法重现这个问题;当我尝试将branchA合并到branchB时,config.xml文件中出现了合并冲突。您能提供一些详细信息吗?folder05/config.xml是何时添加到branchB的?branchB是何时从branchA分支出来的?那时folder05是否已经存在? - kowsky
branchB 在从 branchA 分支中分离出来后,添加了 folder05/config.xml 文件,因此在我提交 folder05/config.xml 文件之前,branchB 已经拥有了该文件。 - Corey
1
我仍然无法重现这个问题,但我怀疑未跟踪的文件 folder05/config.xml~HEAD 是文件的 branchB 版本,而真正的文件 (folder05/config.xml) 是来自 branchA 的。是这种情况吗? - kowsky
branchA版本有更多的字符。 - Corey
folder05/config.xml~HEAD 是文件的 branchB 版本 <-- 这有意义 - Corey
1
@kowsky:产生这个问题有点棘手(如果Kuanlin Chen引用了CONFLICT(rename/add)或其他行会很有帮助),但请参考Edward Thomson的答案 - torek
1个回答

12
它生成了一个名为config.xml~HEAD的文件,这是什么意思?
这个文件是由git自动生成的,因为你有一个文件名冲突的冲突——你在两个分支中有两个不相关的项目尝试占用config.xml的名称。
这可能是由各种情况引起的:
最有可能的是,在你的分支中创建了一个名为config.xml的文件。在你要合并的分支中,另一个文件被重命名为config.xml。由于这两个文件没有共同的祖先,它们无法合并。它们应该都保留在工作目录中,但存在冲突。因此,它们都将被保留,但具有唯一的名称。
在正在合并的分支中,config.xml将作为检出在磁盘上的文件。在你的分支中,config.xml将作为config.xml~HEAD检出在磁盘上。
以下是一个示例,在这个示例中,我们在master分支中添加了一个名为newname.txt的文件,并将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不会跟踪重命名,它使用启发式方法来检测重命名。 因此,实际上这个冲突可能并不是真正的冲突,因为文件可能并没有真正被重命名。)


1
清晰的解释。 - Corey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接