如何切换(或签出)到 Git 中现有的远程分支,而不面临分离的 HEAD

Man*_*nds 1 git git-fetch git-checkout git-detached-head git-switch

首先,当我克隆 Git 存储库时,我位于master 分支中。但我已经创建了一个远程开发分支。我跑git fetch origin develop。然后,我使用 git checkout develop它并切换到一个新的分支开发,如下所示:

在此输入图像描述

它创建了当地新开发的分支机构。如何切换到我的原始开发分支远程分支。如果我使用git checkout origin/develop。它是这样的:

在此输入图像描述

如何切换到远程开发分支?

tor*_*rek 5

如在马特的回答所示,您实际上无法做您要求做的事情。Git 根本不允许这样做。

\n

我认为 Git 的信息让初学者感到困惑:

\n
\n

切换到新分支“develop”。
\n分支“develop”设置为跟踪来自“origin”的远程分支“develop”。

\n
\n

远程分支这个短语具有误导性。远程分支实际上意味着什么 不同的人会用这对词来表达不同的意思,就像这样。所以 Git 可能根本不应该使用它。更好的消息可能是,例如:

\n
Created new branch \'develop\', with its upstream\nset to \'origin/develop\'.\n
Run Code Online (Sandbox Code Playgroud)\n

再次,正如马特的回答一样一样,这几乎肯定是您想要使用的。但如果您愿意,您可以继续使用 detached-HEAD 模式:

\n
git checkout origin/develop\n
Run Code Online (Sandbox Code Playgroud)\n

或者:

\n
git switch --detach origin/develop\n
Run Code Online (Sandbox Code Playgroud)\n

如果您只想查看该特定提交,甚至可能从中构建一个版本,但不进行任何修改,则这种分离头模式是有意义的。

\n

如果你想自己开发,你需要一个(本地)分支。这里棘手的事情是,所有分支实际上都是您自己的 Git 存储库的本地分支。甚至我所说的远程跟踪名称,例如origin/develop,也是您的 Git 存储库的本地名称。每个 Git 存储库都有自己的名称

\n

您可以查看任何其他 Git 的名称\xe2\x80\x94,它会显示给您,即1 \xe2\x80\x94,如果您愿意,可以将它们复制到您自己的 Git 存储库,但您的副本是您,而不是他们的。他们的名字是他们的,你的名字是你的。

\n

当您克隆 Git 存储库时,您将获得其所有提交,但不会获得任何分支名称。您和其他 Git 存储库共享的是提交。重要的是提交,而不是名称。提交本身有大而丑陋的哈希 ID,这就是 Git 在其全 Git 对象的大数据库中实际查找它们的方式。任何分支名称都只是让您\xe2\x80\x94和Git\xe2\x80\x94找到某些哈希ID。其他非分支名称执行相同的操作,因此非分支名称与分支名称一样好,但有一个特殊的例外:签出非分支名称会导致分离的 HEAD。

\n

因此,当您从 GitHub 或 Bitbucket 或 GitLab 等克隆一些 Git 存储库时,您的 Git 会获取所有 Git 的提交。然后,您的 Git 获取每个分支名称,例如develop,并重命名它们。你的 Git在每个名字前面贴上origin/2 。git clone最后\xe2\x80\x94作为\xe2\x80\x94的最后一步,你的Gitgit checkout有效地运行或git switch创建一个新的本地分支,通常是 或, 3上游设置为mastermainorigin/为该名称的版本,你的Git从另一个分支复制Git 该名称的无前缀版本。

\n

(Git 的某些部分将此称为“跟踪”,这是另一个严重重载的词。据说您的本地分支会跟踪其上游。分支的上游设置只是存储库中的各种名称之一,origin/例如相同的名称。Git 的某些部分引用诸如远程跟踪分支名称之类的内容origin/develop将这些远程跟踪名称称为,省略了严重超载的单词分支,但仍然具有有点超载的跟踪部分。)

\n

稍后,您将运行git fetch\xe2\x80\x94 或已为您git pull运行git fetch\xe2\x80\x94,并且您的 Git 调用会调用他们的 Git 以查看他们的存储库中是否有新提交。如果他们这样做了,你的 Git 将带来他们的新提交。您的 Git 将查看其 Git 存储库是否更改了存储在其分支名称中的提交哈希 ID,如果是,将更新您的远程跟踪名称:origin/develop将更新以记住它们develop现在的位置。

\n

git fetch在您运行的 -es之间,它们develop可能会被更新,但您不会知道。那么当您想知道他们更新了吗develop那就是你运行的时候git fetch。如果他们确实更新了他们的develop,您将从他们那里获得任何新的提交,并且您的 Git 将更新您的origin/develop以跟踪他们的develop. 这就是为什么 yourorigin/develop远程跟踪名称

\n

无论如何,这就是为什么远程分支是一个如此糟糕的短语:它意味着develop在另一个 Git 上吗?是不是意味着origin/develop在您自己的 Git 存储库中?

\n
\n

1 Git 中有一套工具,用于在 Git 服务器上保存各种隐藏名称,但我觉得这些工具都不太令人满意。由于它们都有各种缺陷,实际上很少有服务器似乎大量使用这些\xe2\x80\x94,但我没有直接了解 GitHub、Bitbucket 和 GitLab 如何运行其服务,所以也许他们确实使用了它们,并且他们比我想象的更好。:-)

\n

2您可以让 Git 使用origin此处以外的其他内容,但这是默认设置,因此您将看到这样的内容。从技术上讲,这些远程跟踪名称位于单独的命名空间中中,但我们不会在这里讨论这一点。

\n

3旧标准,自动第一个分支名称是master; GitHub 将其更改为main,许多人纷纷效仿。不过,这两个名称都没有什么特别之处,并且您的项目可能有不同的第一个分支名称。当你运行 时git clone,你可以使用 选项告诉 Git 你想要复制哪个 Git 分支名称-b。如果您不选择其中之一,您的 Git 会询问他们的 Git 推荐内容,然后复制该建议。这就是你的 Git 将遵循 GitHub 的方式main例如,

\n