起初,当我克隆 Git 存储库时,我在master 分支中。但我已经创建了一个远程开发分支。我跑git fetch origin develop
。然后,我使用 git checkout develop
它切换到一个新的分支开发,如下所示:
它创建本地新的开发分支。如何切换到我的起源开发分支远程之一。如果我使用git checkout origin/develop。它是这样的:
如何切换到我的远程开发分支?
起初,当我克隆 Git 存储库时,我在master 分支中。但我已经创建了一个远程开发分支。我跑git fetch origin develop
。然后,我使用 git checkout develop
它切换到一个新的分支开发,如下所示:
它创建本地新的开发分支。如何切换到我的起源开发分支远程之一。如果我使用git checkout origin/develop。它是这样的:
如何切换到我的远程开发分支?
您通常不希望直接使用远程跟踪分支。相反,您将执行 agit fetch
然后从最新的远程跟踪分支创建一个新的本地分支,如下所示:
git fetch origin # update remote tracking branch
git checkout -b your_develop origin/develop # create new local develop branch
如何切换到我的远程开发分支?
你不能。您不能在远程分支上工作。
在远程跟踪分支结束时开始工作的方法是从该点开始本地分支,通常使用相同的名称并通常跟踪远程跟踪分支。
通常,如果您已经 fetched origin/develop
,这应该会自动执行此操作:
git checkout develop
这就是你的 Git 所做的回应,而且是正确的。如果您仍然不明白为什么,您应该了解分支是如何工作的。
至于您的分离头:您唯一可以checkout
在没有分离头的情况下是本地分支名称。
当您签出时develop
,git 不会抱怨分支不存在,所以要么
develop
,您应该删除 ( git branch -D develop
) 注意可能会丢失那里的本地进度当您签出时origin/develop
,您正在检查远程分支的副本,这就是它有一个分离头的原因
正如马特的回答一样,你真的不能做你要求做的事情。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 clone
Git 有效地运行git checkout
或git switch
创建一个新的本地分支,通常是master
或3main
,其上游设置为该名称的版本,你的 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/develop
develop
origin/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
建议。