0

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

在此处输入图像描述

它创建本地新的开发分支。如何切换到我的起源开发分支远程之一。如果我使用git checkout origin/develop。它是这样的:

在此处输入图像描述

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

4

4 回答 4

3

您通常不希望直接使用远程跟踪分支。相反,您将执行 agit fetch然后从最新的远程跟踪分支创建一个新的本地分支,如下所示:

git fetch origin                             # update remote tracking branch
git checkout -b your_develop origin/develop  # create new local develop branch
于 2021-06-14T05:22:49.900 回答
2

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

你不能。您不能在远程分支上工作。

在远程跟踪分支结束时开始工作的方法是从该点开始本地分支,通常使用相同的名称并通常跟踪远程跟踪分支。

通常,如果您已经 fetched origin/develop,这应该会自动执行此操作:

git checkout develop

这就是你的 Git 所做的回应,而且是正确的。如果您仍然不明白为什么,您应该了解分支是如何工作的。

至于您的分离头:您唯一可以checkout在没有分离头的情况下是本地分支名称。

于 2021-06-14T07:04:20.857 回答
1

当您签出时develop,git 不会抱怨分支不存在,所以要么

  • 您有一个名为的本地分支develop,您应该删除 ( git branch -D develop) 注意可能会丢失那里的本地进度
  • 它确实在检查远程分支

当您签出时origin/develop,您正在检查远程分支的副本,这就是它有一个分离头的原因

于 2021-06-14T05:20:47.593 回答
1

正如马特的回答一样,你真的不能做你要求做的事情。Git根本不会允许它。

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

切换到一个新的分支“开发”。
分支“开发”设置为从“原点”跟踪远程分支“开发”。

短语远程分支具有误导性。远程分支实际上是什么意思? 不同的人会用这对词,一模一样,表示不同的东西。所以 Git 可能根本不应该使用它。更好的信息可能是,例如:

Created new branch 'develop', with its upstream
set to 'origin/develop'.

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

git checkout origin/develop

或者:

git switch --detach origin/develop

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

如果你想做自己的开发,你需要一个(本地)分支。这里的棘手之处在于,所有分支实际上都是您自己的 Git 存储库的本地分支。甚至我称之为远程跟踪名称的东西,例如,在您的 Git 存储库origin/develop中都是本地的。每个 Git 存储库都有自己的名称

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

当你克隆一个 Git 存储库时,你会得到它的所有提交但没有一个分支名称。您和其他 Git 存储库共享的是提交。重要的是提交,而不是名称。提交本身具有大而丑陋的哈希 ID,这就是 Git 在其所有 Git 对象的大型数据库中实际查找它们的方式。任何分支名称都只会让您和 Git 找到特定的哈希 ID。其他的,非分支名称做同样的事情,所以非分支名称和分支名称一样好,除了一个特殊的例外:检查一个非分支名称会导致一个分离的 HEAD。

因此,当您从 GitHub 或 Bitbucket 或 GitLab 或其他任何地方克隆一些 Git 存储库时,您的 Git 会获取所有 Git 的提交。然后,您的 Git 获取它们的每个分支名称,例如develop并重命名它们。你的 Git在每个名字前面加上origin/2 。最后——作为最后一步——你的git cloneGit 有效地运行git checkoutgit switch创建一个新的本地分支,通常是master3main,其上游设置为该名称的版本,你的 Git 从另一个 Git 的该名称的无前缀版本复制.origin/

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

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

git fetch您运行的 -es 之间,它们develop可能会更新,而您不会知道。因此,当您想知道他们是否更新了他们的develop? 那是你会跑的时候git fetch。如果他们确实更新了他们develop的. 这就是为什么你是一个远程跟踪名称origin/developdeveloporigin/develop

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


1 Git 中有一套设施,我觉得其中没有一个让我很满意,用于在 Git 服务器上保留各种隐藏名称。由于它们都有各种缺陷,实际上很少有服务器会大量使用它们——但我对 GitHub、Bitbucket 和 GitLab 是如何运行它们的服务没有直接的了解,所以也许它们确实使用了它们并且它们比我认为。:-)

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

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

于 2021-06-14T08:18:15.060 回答