我们在中央服务器上有一个共享的“开发”存储库,具有不同的分支,称为 v4、v5、v6
开发人员(“Alice”)已提交 v6,一切看起来都不错。我有一个接收后挂钩,它收集了所有相关细节,持续集成服务器可以克隆存储库并检查这个提交并处理它——一切都很好。
但是,当我在我的个人副本和 git pull 中签出 v6 时,我根本没有得到提交“Alice”。它根本不会出现在日志中,也不会被拉到我的机器上。
当我通过 cgit 浏览 repo 时,提交不会显示在“日志”中 - 但如果我从 SHA 和分支构建查看 URL,我可以看到提交。
就像 Alice 已经推送到中央(裸)repo 中的一个不可见的并行 v6 分支。如何让这个无形的分支显露出来?
那么可能发生了什么?在 Alice 提交之前几个小时,我使用命令删除了中央仓库上的 v6 分支git push origin :v6
。v6 是空的,基于原始母版,但我希望它源自最新的 v5 作品。为此,我检查了 v5,进行了 git pull,然后将其检查到 v6。然后我将此 v6 推送到共享仓库。
所以看起来我的删除不起作用,并且以某种方式 Alice 推送到了 v6,而不是 git 认为的 v6。
我的修复?修改裸仓库上的 refs/heads/Release_6 以包含 Alice 提交的 SHA。
但这是正确的做法吗?git 如何在不严重抱怨的情况下维护或允许影子分支?Git 没有在我的仓库或 Alice 的..
回答: 看起来裸 repo refs/heads/v6 被我笨拙的 rebase 尝试弄坏了。在将 Alice 的提交的 SHA 写入裸 repo refs/heads/v6 之后,一切都出现在它应该做的事情上。
POST_MORTEM 分析。
服务器“裸”存储库实际上是从一些原始工作中克隆的(使用 --bare)。原始仓库有 v4、v5、v6。
周末有一个脚本在git fetch origin +refs/heads/*:refs/heads/*
裸仓库上运行,我猜是因为“+”修饰符,很容易覆盖了我们用原始仓库中的“旧”v6 创建的“新”v6。
这就解释了为什么 v6 工作似乎有效,然后在周末消失了。
没有 git 的错,很明显是我自己犯的错误。是时候坐在顽皮的台阶上了。