【问题标题】:Why can’t you merge in a bare git repo?为什么不能合并到一个裸 git repo 中?
【发布时间】:2013-09-01 03:17:17
【问题描述】:

为什么我不能 merge 进入一个裸仓库?裸仓库没有HEAD 或工作树。在配置文件中我们可以看到bare=true

你也不能 pull 在一个裸仓库中(因为 pull = fetch & merge 和 merge 不起作用)。但是,你可以推送到一个裸仓库——为什么?据我所知,push 也包含一个合并,但在这种情况下我们可以做得很好。

所以,问题可能是“git merge 是如何工作的?”。为什么需要HEAD?合并时它在做什么?

【问题讨论】:

  • Push 不会在目标 repo 中进行合并。它只是进行快进合并,这不是真正的合并,只是将分支头移动到其他地方。

标签: git git-merge git-bare


【解决方案1】:

As Chronial points out,push 执行快进合并或强制更新,这只是将引用/分支指针移动到不同的提交。

在实际的非快进合并中,您需要一份工作副本,以防遇到需要解决的冲突。其他 Stack Overflow 用户之前已经提到过;例如,见this answer(强调我的):

git 在工作树上执行所有合并操作(真正的合并、cherry-picks、rebases、补丁应用程序)。这在之前多次提到过,例如在知识渊博的 Jakub Narębski 的答案之一中:

如果不触及工作目录(和索引)就无法进行合并(或变基),因为可能存在必须使用工作目录(和/或索引)解决的合并冲突强>。

【讨论】:

  • 我说的对吗?当 git do merge - 首先它查找它的数据库。 Git 比较哈希值(如果它们不同 - 它会解压缩 2 个文件的快照并在内部进行比较)。为什么 git 需要工作目录来合并它自己数据库中的两个提交的分支?
  • 第二句话和问题。当我们合并时——git 首先做什么?它尝试比较散列,但哪个散列?当前分支和早午餐合并的哈希。当我们拉到裸仓库时,git 会做什么? Git尝试查找当前早午餐的哈希(即使在裸仓库中我们有主早午餐),git查找主服务器的HEAD以查找最后使用(HEAD)提交的哈希但裸仓库没有HEAD(甚至工作树)。所以它得到错误。这是真的?请纠正我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 2018-11-08
相关资源
最近更新 更多