- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
正如标题所说,为什么会发生这种情况?
如文档和教程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"?
当你用一个分支的名字,你就会被放在那个分支上
使用master
或git 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/
XMLHttpRequest cannot load http://localhost:8080/api/test. Origin http://localhost:3000 is not allow
Git diff 似乎在比较时返回不同的变化: git diff origin/master ... origin/branch git diff origin/master...origin/bra
我正在研究 3.1 Git Branching - Branches in a Nutshell 中的 git 分支概念 我正在玩虚拟存储库。 git log --oneline --decorate
我知道有很多类似的问题,唯一的区别是我从 **same ** 域提供的两个页面得到了这个。这可以在下面的示例中看到。 Uncaught DOMException: Blocked a fram
我被要求使用 Fork Workflow,即我必须处理具有相同或相似名称的多个分支。我为什么要使用这些不同的变体? 以下是不同命名约定的一些示例: 我的分支机构 起源我的分支 起源/我的分支机构 远程
这个问题已经有答案了: How do I delete a Git branch locally and remotely? (41 个回答) 已关闭 9 年前。 好的,我已经创建了一个 origin
这是我关于如何让 lerna 在 Jenkins 中运行的一系列问题的一部分。 上一期: lerna publish on Jenkins "git remote update" Fails "Cou
当我尝试从我的 Angular 6 应用程序访问 Webhdfs 时,我收到如下所示的错误。在我看来,我几乎尝试了所有方法,包括更改 core-site.xml 和 hdfs-site.xml 中的设
我正在从不同的来源向我的服务器发出 Ajax POST 请求以供用户登录。我已经在我的 application_controller.rb 中正确设置了 Cross Origin header : d
我刚刚克隆了一个存储库并在 Git 中开始了一个新分支。我已经这样做了很多次而没有遇到问题。今晚当我尝试使用 git branch --set-upstream develop origin/deve
我对 Git 还很陌生,但仍在掌握它的窍门。我最近才开始使用分支机构,遇到了一些问题。 我有两个开发系统,一个 Ubuntu 桌面和一个 MacBookPro。我在 Ubuntu 系统上的一个新的 o
这个问题在这里已经有了答案: Why does "git push main" work on GitHub when "git push master" does not? Also what i
我想从我的应用访问一个 API。 curl 请求是: curl --request POST https://... --header 'Authorization: Token ...'
我试图理解的遗留 makefile 具有 -Wl,-z,origin,-rpath,'$ORIGIN/../lib' 好的,我看到 -Wl 表示以下是链接器选项;逗号将替换为空格。 GNU ld 的联
我正在寻找 OpenShift Origin 和 OpenShift Enterprise 之间的主要区别。我知道第一个是开源的,后者是商业版。与开源版本相比,OpenShift Enterprise
我在 Sourcetree 中有这个历史图表: Sourcetree graph 如何将最后一次提交从 origin/development 复制到 origin/master 分支? 第二个问题:图
运行 git 命令时空格和斜杠有什么区别? 我有时会看到 git push origin master(这是一个空格) 还有其他时候我看到 git rebase origin/master(使用斜杠)
根据文档,git pull 执行 git fetch 然后执行 git merge,但是在那种情况下执行 git pull origin master 应该执行 git fetch origin ma
我正在使用我的 git 存储库,并在早些时候对 master 分支进行了相当多的提交。现在我意识到它有点太吵了,我想将所有这些 merge 到一个提交中。 102381 commit z .... 1
我制作了一个小的 xslt 文件来创建一个名为 weather.xsl 的 html 输出,代码如下: 我想将 html 输出加载到 html 文件中的 div 中,我正在尝试
我是一名优秀的程序员,十分优秀!