在TortoiseGit中,MERGE_HEAD和HEAD分别代表什么?

34

这是一个简单的问题,但 Git 的标签十分令人困惑,我找不到答案。

当我有本地更改并希望将最新的远程仓库合并到本地仓库时,我会先进行本地提交,然后使用 git pull 命令。

当出现合并冲突时,我可以选择使用 MERGE_HEAD 或 HEAD 来解决冲突。

哪一个是远程仓库,哪一个是本地仓库呢?

谢谢。

2个回答

33

它们都是本地的(这很重要,尽管不太有帮助 :-) )。

HEAD 是你当前所在的分支,也就是你现在检出的那个分支。 对于 git merge 命令来说,它指的是你开始时检出的分支。

MERGE_HEAD 是另一个提交,也就是你告诉 Git 要合并哪个提交的哈希 ID。也就是说,git merge origin/masterorigin/master 解析为一些本地提交哈希 ID,然后合并该提交,而 MERGE_HEAD 包含该提交的哈希 ID。

我认为另一个提交的更好术语应该是 "other" 或者 --theirs,Git 有时会使用这些术语,但 Git 的其他部分确实使用术语 "remote" 来指代 --theirs 提交。


1
@UlyssesAlves:“源”和“目标”这两个术语也不太合适,因为两个输入都是源。HEAD既是当前提交,也是当前分支MERGE_HEAD是您在请求执行合并时命名的提交,例如,git merge bob以合并分支bob顶部的提交;而这两个提交都是源。还有第三个源,即Git为您计算的合并基础提交。Git将这三个源组合起来生成一个新的提交,该提交放在当前分支上。 - torek
1
请注意,您需要运行 git checkout alice 来选择该分支进行开始。Alice 将成为您当前的 分支,她最新的提交现在也是您当前的 提交。现在您可以询问 Git:说一下:HEAD 名称对应哪个分支? 答案是 alice,或者:告诉我:HEAD 名称对应哪个提交? 答案可能是 a123456...。一个提交的真实名称是其哈希 ID;HEAD 可以被翻译为 分支名称提交哈希值 中的任意一个。 - torek
2
好的,“HEAD”是当前提交,所以如果你这样想的话,那就是“当前版本”。真正的问题在于,如果你正在进行rebase而不是merge,那么当前提交来自你正在构建的新分支,而--theirs或MERGE_HEAD提交来自你正在复制以创建新提交的分支。所以现在甚至没有更直接的映射了! - torek
1
所以,HEAD是当前的,也许是你关心文件状态的本地位置,而MERGE_HEAD则是另一个,在与相关集合相对应的远程位置上。 - Post169
TortoiseGit应该将HEAD显示在左侧,而不是右侧,因为其他非冲突文件将当前分支显示在左侧。如何将HEAD与MERGE_HEAD交换位置,使其显示在左侧和右侧? - Dee
显示剩余4条评论

2
我在搜索同样的问题时偶然发现了这个线程。我使用WinMerge作为TortoiseGit的合并工具,当解决冲突时,它显示3个窗格:MERGE_HEAD位于左侧,Base 位于中间,而HEAD 位于右侧。
结果证明,MERGE_HEAD是您要合并的提交/分支,HEAD是您要合并到的提交/分支,而 Base 是您应该编辑以解决冲突的合并结果。
因此,您应该编辑中间窗格中的代码,即 Base ,保存并提交。
更新11/11/2021:此答案不准确...请参见下面的评论。

7
这个答案是错误的。Winmerge显示的是Base | Merge_head | Head,你只能编辑Head部分。 - Grahame Grieve
谢谢澄清。老实说,每次发生冲突时,我仍然感到对命名的困惑 :) 但是应该编辑中间的面板,对吗? - A. Genedy

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