如何在不面对分离的 HEAD 的情况下切换或检出到 Git 中现有的远程分支

问题描述

起初,当我克隆 Git 存储库时,我位于 ma​​ster 分支。但是我已经创建了一个远程开发分支。我运行data = { "tracks": [ { "album": { "album_type": "single","artists": [ { "external_urls": { "spotify": "https://open.spotify.com/artist/6sFIWsNpZYqfjUpaCgueju" },"href": "https://api.spotify.com/v1/artists/6sFIWsNpZYqfjUpaCgueju","id": "6sFIWsNpZYqfjUpaCgueju","name": "Carly Rae jepsen","type": "artist","uri": "spotify:artist:6sFIWsNpZYqfjUpaCgueju" } ],"available_markets": [ "AD","AR","AT","AU","BE","BG","BO","BR","CA","CH","CL","CO","CR","CY","CZ","DE","DK","DO","EC","EE","ES","FI","FR","GB","GR","GT","HK","HN","HU","ID","IE","IL","IS","IT","JP","LI","LT","LU","LV","MC","MT","MX","MY","NI","NL","NO","NZ","PA","PE","PH","PL","PT","PY","RO","SE","SG","SK","SV","TH","TR","TW","US","UY","VN","ZA" ],"external_urls": { "spotify": "https://open.spotify.com/album/0tGPJ0bkWOUmH7MEOR77qc" },"href": "https://api.spotify.com/v1/albums/0tGPJ0bkWOUmH7MEOR77qc","id": "0tGPJ0bkWOUmH7MEOR77qc","images": [ { "height": 640,"url": "https://i.scdn.co/image/966ade7a8c43b72faa53822b74a899c675aaafee","width": 640 },{ "height": 300,"url": "https://i.scdn.co/image/107819f5dc557d5d0a4b216781c6ec1b2f3c5ab2","width": 300 },{ "height": 64,"url": "https://i.scdn.co/image/5a73a056d0af707b4119a883d87285feda543fbb","width": 64 } ],"name": "Cut To The Feeling","release_date": "2017-05-26","release_date_precision": "day","type": "album","uri": "spotify:album:0tGPJ0bkWOUmH7MEOR77qc" },"artists": [ { "external_urls": { "spotify": "https://open.spotify.com/artist/6sFIWsNpZYqfjUpaCgueju" },"uri": "spotify:artist:6sFIWsNpZYqfjUpaCgueju" } ],"available_markets": [ "AD","ZA" ],"disc_number": 1,"duration_ms": 207959,"explicit": False,"external_ids": { "isrc": "USUM71703861" },"external_urls": { "spotify": "https://open.spotify.com/track/11dFghVXANMlKmJXsNCbNl" },"href": "https://api.spotify.com/v1/tracks/11dFghVXANMlKmJXsNCbNl","id": "11dFghVXANMlKmJXsNCbNl","is_local": False,"popularity": 63,"preview_url": "https://p.scdn.co/mp3-preview/3eb16018c2a700240e9dfb8817b6f2d041f15eb1?cid=774b29d4f13844c495f206cafdad9c86","track_number": 1,"type": "track","uri": "spotify:track:11dFghVXANMlKmJXsNCbNl" },{ "album": { "album_type": "album","external_urls": { "spotify": "https://open.spotify.com/album/6SSSF9Y6MiPdQoxqBptrR2" },"href": "https://api.spotify.com/v1/albums/6SSSF9Y6MiPdQoxqBptrR2","id": "6SSSF9Y6MiPdQoxqBptrR2","url": "https://i.scdn.co/image/2fb20bf4c1fb29b503bfc21516ff4b1a334b6372","url": "https://i.scdn.co/image/a7b076ed5aa0746a21bc71ab7d2b6ed80dd3ebfe","url": "https://i.scdn.co/image/b1d4c7643cf17c06b967b50623d7d93725b31de5","name": "Kiss","release_date": "2012-01-01","uri": "spotify:album:6SSSF9Y6MiPdQoxqBptrR2" },"duration_ms": 193400,"external_ids": { "isrc": "CAB391100615" },"external_urls": { "spotify": "https://open.spotify.com/track/20I6sIOMTCkB6w7ryavxtO" },"href": "https://api.spotify.com/v1/tracks/20I6sIOMTCkB6w7ryavxtO","id": "20I6sIOMTCkB6w7ryavxtO","name": "Call Me Maybe","popularity": 74,"preview_url": "https://p.scdn.co/mp3-preview/335bede49342352cddd53cc83af582e2240303bb?cid=774b29d4f13844c495f206cafdad9c86","track_number": 3,"uri": "spotify:track:20I6sIOMTCkB6w7ryavxtO" },"external_urls": { "spotify": "https://open.spotify.com/album/1DFixLWuPkv3KT3TnV35m3" },"href": "https://api.spotify.com/v1/albums/1DFixLWuPkv3KT3TnV35m3","id": "1DFixLWuPkv3KT3TnV35m3","url": "https://i.scdn.co/image/3f65c5400c7f24541bfd48e60f646e6af4d6c666","url": "https://i.scdn.co/image/ff347680d9e62ccc144926377d4769b02a1024dc","url": "https://i.scdn.co/image/c836e14a8ceca89e18012cab295f58ceeba72594","name": "Emotion (Deluxe)","release_date": "2015-09-18","uri": "spotify:album:1DFixLWuPkv3KT3TnV35m3" },"duration_ms": 251319,"external_ids": { "isrc": "USUM71507009" },"external_urls": { "spotify": "https://open.spotify.com/track/7xGfFoTpQ2E7fRF5lN10tr" },"href": "https://api.spotify.com/v1/tracks/7xGfFoTpQ2E7fRF5lN10tr","id": "7xGfFoTpQ2E7fRF5lN10tr","name": "Run Away With Me","popularity": 50,"preview_url": "https://p.scdn.co/mp3-preview/3e05f5ed147ca075c7ae77c01f2cc0e14cfad78d?cid=774b29d4f13844c495f206cafdad9c86","uri": "spotify:track:7xGfFoTpQ2E7fRF5lN10tr" } ] } 。然后,我使用 git fetch origin develop 并切换到一个新的分支开发,如下所示:

enter image description here

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

enter image description here

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

解决方法

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

git fetch origin                             # update remote tracking branch
git checkout -b your_develop origin/develop  # create new local develop branch
,

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

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

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

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

git checkout develop

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

至于你的分离头:唯一你可以checkout而无需获得分离头的是本地分支名称。

,

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

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

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

,

就像在 matt's answer 中一样,您实际上无法做您要求做的事情。 Git 根本不允许这样做。

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

切换到一个新的分支'develop'。
分支 'develop' 设置为从 'origin' 跟踪远程分支 'develop'。

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

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

同样,就像在 matt's answer 中一样,这几乎肯定是您想要使用的。但是,如果您愿意,您可以继续使用以下任一方式使用 detached-HEAD 模式:

git checkout origin/develop

或:

git switch --detach origin/develop

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

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

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

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

因此,当您从 GitHub 或 Bitbucket 或 GitLab 或其他任何地方克隆某个 Git 存储库时,您的 Git 会获得他们所有的 Git 提交。然后,您的 Git 使用它们的每个分支名称,例如 develop,并重命名它们。您的 Git 将 origin/2 放在每个名称的前面。最后 — 作为 git clone 的最后一步 — 您的 Git 有效地运行 git checkoutgit switch创建一个新的本地分支,通常是 master 或 { {1}},3,其 upstream 设置为该名称的 main 版本,这是您的 Git 从另一个 Git 的无前缀版本复制而来名字。

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

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

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

无论如何,这就是为什么 remote branch 是一个糟糕的词组:它是否意味着另一个 Git 上的 origin/develop?这是否意味着 develop 在您自己的 Git 存储库中?


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

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

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