1
  1. 在 Github 上创建了一个 repo(使用自述文件初始化)。
  2. 用 Egit 克隆它。
  3. 看到 FETCH_HEAD 和 HEAD 被检出。
  4. 去 Github 并更改了自述文件。
  5. 拿到零钱。
  6. 看到 HEAD 已签出, FETCH_HEAD 没有。但 FETCH_HEAD 确实有自述文件更新。origin/master 的跟踪分支也有更新。
  7. 将 origin/master 的跟踪分支合并到我的本地 master 中。
  8. 看到 FETCH_HEAD 和 HEAD 再次被检出。

FETCH_HEAD

根据这篇文章: Git 中的 FETCH_HEAD 是什么意思?

FETCH_HEAD 是一个短暂的 ref,用于跟踪刚刚从远程存储库中获取的内容。

为什么 FETCH_HEAD 在获取后没有立即签出?为什么只有在我将源的跟踪分支合并到我的本地 master 后才被检出?

4

1 回答 1

0

为什么FETCH_HEAD提取后没有立即签出?为什么只有在我将源的跟踪分支合并到我的本地 master 后才被检出?

FETCH_HEAD本身不引用任何分支:它只记住最后获取的 SHA1。
因为它没有引用分支,所以它并没有真正被检出(也不应该被检出),或者你最终会得到一个分离的 head

但是,将跟踪分支合并到master分支将更新HEAD(指向更新的 master):该分支已签出。
如果合并是快进HEAD,则签出分支FETCH-HEAD将引用相同的 SHA1,给人的印象FETCH_HEAD是“签出”(实际上并非如此)


换句话说,在下图中:

在 Egit 签出

FETCH_HEAD仅因为它引用与当前已签出分支HEAD(此处master相同的 SHA1 才具有“签出”标记。

这意味着,如果您执行新的提交

  • FETCH_HEAD不会再有签出的勾号(它仍然会引用最后获取的 SHA1)。这就是为什么我说它不是“真正的”签出(在“新提交后它不会保持签出,因为它是对特定 SHA1的固定引用)
  • HEAD并且该master分支将引用一个新的 SHA1,并保持已签出的勾号。

但是,如果您要直接签出FETCH_HEADSHA1(在将其合并到之前masterEgit 用户指南提到,如果参考尚未签出,您可以这样做),那么:

  • FETCH_HEAD仍将“签出”
  • 同样的HEAD
  • 但是master(或任何其他分支)将不再被签出:这是一个分离的头部情况

如果您要在已签出的基础上进行的提交FETCH_HEAD

  • FETCH_HEAD将不再被签出(因为它仍然固定在最后获取的 SHA1 上)
  • HEAD 将指向签出的新提交。
  • 没有分支会被“签出”:分离的 HEAD。

您需要打开在 顶部完成的签出提交FETCH_HEAD,并从那里创建一个分支:

创建一个分支

(来自文章“ Git 课程:注意一个超然的头脑”)


综上所述:

每次您在FETCH_HEAD引用上看到“签出刻度”时,这是因为它引用了与当前签出的引用相同的 SHA1(提交或分支)。
不是因为FETCH_HEAD它本身被检出:如果你在它之上做了一个新的提交,它就不会再被检出。

于 2013-08-07T11:52:34.737 回答