为什么不能在一个裸的Git存储库中合并?

5
为什么我不能将代码合并到裸仓库?因为裸仓库没有HEAD或工作树。在配置文件中,我们可以看到bare=true。
你也不能在裸仓库中拉取(因为pull = fetch & merge,而合并不起作用)。但是,你可以向裸仓库推送 - 为什么?据我所知,push也包含合并,但在这种情况下我们可以成功地完成它。
因此,问题可能是“git merge是如何工作的?”为什么它需要HEAD?合并时它在做什么?

2
Push 在目标仓库中并不执行合并操作。它仅执行快进式合并,这不是真正的合并,只是将分支头移动到另一个位置而已。 - Chronial
1个回答

1

正如Chronial所指出的那样, push操作会进行快进合并或强制更新,这只是将引用/分支指针移动到不同的提交。

在实际的非快进合并中,如果遇到需要解决的冲突,你需要有一个工作副本。其他Stack Overflow用户之前也提到过这一点;例如,请参见这个答案(重点在于我):

Git在工作树上执行所有合并操作(真正的合并,樱桃拣选,变基,补丁应用)。这已经在Jakub Narębski的一些知识渊博的回答中多次提到:

没有办法进行合并(或变基)而不触及工作目录(和索引),因为可能存在必须使用工作目录(和/或索引)来解决的合并冲突


我说的对吗?当 Git 进行合并时,首先它会查找自己的数据库。Git 比较哈希值(如果它们不同,则解压缩两个文件的快照并在其中进行比较)。为什么 Git 需要工作目录来合并其自己数据库中的两个提交分支呢? - Naughty Leopard
第二个备注和问题。当我们合并时,Git首先做什么?它尝试比较哈希值,但是哪些哈希值呢?当前分支和合并自分支的哈希值。当我们拉取到裸仓库时,Git会做什么?Git尝试找到当前分支的哈希值(即使在裸仓库中我们有主分支),Git查找主分支的HEAD以找到最后使用的(HEAD)提交的哈希值,但裸仓库没有HEAD(甚至没有工作树)。所以会出现错误。这是真的吗?请纠正我。 - Naughty Leopard

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