gpt4 book ai didi

git - 为什么git check out origin/master导致HEAD分离

转载 作者:太空狗 更新时间:2023-10-29 14:43:55 30 4
gpt4 key购买 nike

正如标题所说,为什么会发生这种情况?
如文档和教程origin/master中所述
实际上是远程分支的本地副本。
那么,如果“只是分支的本地副本”,为什么签出它会导致分离头?

最佳答案

这就是在git中定义分支的方式。
具体地说,一个分支,即一个常规的、普通的、局部的分支,是一种参考。标记也是,远程跟踪分支也是。区别于其他人的是它的全名,同样地,如果你和几个叫鲍勃的人在一个聚会上,他们可能至少有不同的全名。
分支名称以refs/heads/开头,而远程跟踪分支以refs/remotes/开头,后跟远程的名称。这意味着refs/heads/master是分支名称,而refs/remotes/origin/master是远程跟踪分支名称。
引用通常指向提交
这些“引用”只是存储(一个,单个)git对象的id,通常是提交。
git中的“branch”一词有歧义
当我们称之为分支时,它实际上是一个分支名称。因此,它是一个引用,并且存储单个提交的id。哪个承诺?嗯,这是分行的小费。那么,什么是“形容词”分支呢?
git分支也是一组提交。git查找集合的方式是以分支名称开头,该名称为git提供分支上tip commit的id。从该提交中,git可以找到一个或多个较早的提交,称为该提交的父级。从这些提交中,git可以找到他们的父母,等等,通过时间。
当人们谈论git中的“一个分支”时,您必须根据上下文来确定它们是指“分支名称”、“分支上的提示提交”还是“该分支上的一组提交,可能不包括该分支上的提交以及同时在其他分支上的提交”。
有关更多信息,请参见What exactly do we mean by "branch"?
当你用一个分支的名字,你就会被放在那个分支上
使用mastergit checkout,您告诉git您希望“进入”给定的分支。实际上,git是如何将分支名称转换为完整的引用名称-git checkout master-并将该名称写入文件git checkout develop.也就是说,你的头只记录了当前分行的名称。
在此(附加头)模式下,refs/heads/branch文件充当间接引用。分支的尖端仍记录在“真实”引用中,以全名存储。出于好的或坏的原因(稍后我们将看到一些),git限制允许存储在.git/HEAD中的字符串:它们只能是以HEAD开头的字符串。
因为HEAD不是从refs/heads/开始的,所以您根本不允许“on”refs/remotes/origin/master。同样,您也不能位于类似于refs/heads/的标记上:该标记也不能以refs/remotes/origin/master开头。所以如果你试着去看看其中一个,git会让你进入“独立的头脑”模式。
分离头
在“detached head”模式下,git在refs/tags/v2.1文件中记录提交的原始散列id,而不是记录当前分支的名称。这意味着你不在任何分支上。但是,git仍然允许您进行新的提交,或者在历史记录中移动:当您执行这些操作时,它只是根据需要将一个新id存储到refs/heads/中。
大多数情况下,独立的头部模式有利于观察历史。它还被.git/HEAD之类的命令在幕后使用,这些命令复制提交的整个链,然后调整分支名称。
所以,如果.git/HEAD中有一个散列id,它将被分离,这是您当前的提交。否则,git rebase中有一个分支名称(以HEAD开头),该分支名称存储分支的tip commit的id(“points to”)。
为了找出您所在的分支,git读取HEAD。如果它有一个原始的散列ID,那么您就没有“在”任何分支(尽管实际上您是在一个特殊的匿名分支上)。否则,git会去掉refs/heads/部分并将其作为分支的名称打印出来。
这就是为什么在HEAD中不允许远程跟踪分支名称的原因1:没有可以删除的refs/heads/
树枝是如何生长的
分支通过新的提交而生长。要进行新的提交,git:
HEAD中读取当前提交id(如果是间接的,则在它之后读取分支引用)。
将父级设置为在步骤1中获得的id的新提交(加上author和committer、树和日志消息)。此新提交将获取一个新的唯一哈希ID。
将在步骤2中获得的哈希ID写入refs/heads/(如果是间接的,则将其写入分支引用)。
这个新的提交现在指向上一个分支提示,因为新的id现在存储在分支名称中,所以新的提交现在是您所在分支的提示!
但这立即导致了不允许远程跟踪分支的原因2:进行新的提交将导致您无法正确跟踪远程。远程跟踪引用应该指向从远程获取的提交,而不是本地生成的提交。
显然,这两个原因都有答案(例如,在远程跟踪分支或标记上禁止新的提交,并在必要时拼写出完整的引用)。但是git的设计者显然不喜欢这样,而是更喜欢“独立的头”模式。

关于git - 为什么git check out origin/master导致HEAD分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39893183/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com