了解FETCH_HEAD行为

时间:2013-08-02 18:18:27

标签: eclipse egit

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

    根据这篇文章:What does FETCH_HEAD in Git mean?

      

    FETCH_HEAD是一个短命的参考,用于跟踪刚刚发生的事情   从远程存储库中获取。

    为什么在取出后没有立即检出FETCH_HEAD?为什么只有在我将原点的跟踪分支合并到我的本地主人后才能检出它?

1 个答案:

答案 0 :(得分:0)

  

为什么在取出后没有FETCH_HEAD检出?为什么只有在我将原点的跟踪分支合并到我的本地主人后才能检出它?

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

但是,将跟踪分支合并到master分支将更新HEAD(指向更新的主分支):该分支已签出。
如果合并为"fast-forward" one,则签出的分支HEAD FETCH-HEAD会引用相同的SHA1,从而产生FETCH_HEAD已“签出”的印象(事实并非如此)


换句话说,在下图中:

checked out in Egit

FETCH_HEAD的“签出”勾选仅因为它引用了与当前签出分支HEAD相同的SHA1(此处为master

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

  • FETCH_HEAD将不再有签出的勾号(它仍会引用最后一次获取的SHA1)。这就是为什么我说它不是“真正”签出的(在“新的提交后它不会保持签出”的意义上,因为它是 fixed < / em>引用特定的SHA1)
  • HEADmaster分支会引用新的SHA1,并会保留签出的勾号。

但是,如果你直接检查FETCH_HEAD SHA1(在合并到master之前:the Egit User Guide提到你可以这样做,如果参考尚未检出) ,然后:

  • FETCH_HEAD仍将“签出”
  • HEAD
  • 相同
  • master(或任何其他分支)将不再签出:这是DETACHED HEAD situation

如果您要在签出FETCH_HEAD之上进行提交:

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

您需要在FETCH_HEAD之上打开已签出的提交,并从那里创建一个分支:

create a branch

(来自文章“Git Lesson: Be mindful of a detached head”)


总结:

每次在FETCH_HEAD引用上看到“签出勾选”时,都是因为它引用的SHA1与当前签出的引用相同(提交,或者分支) not 是因为FETCH_HEAD本身已经签出:你在它上面做了一个新的提交,它将不再被检出。