17

我在 Github 上有一个带有 2 个分支的存储库:masterdevelop.

当我克隆存储库并运行$ git branch它时,它只显示master分支。
如果我运行,$ git branch -a我可以看到所有远程分支。

现在,如果我执行 a $ git checkout develop,我会收到以下消息:

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

究竟发生了什么?是在我运行时获取远程develop分支的提交$ git clone remote-url,还是在运行时获取:$ git checkout develop,或者两者都没有?

$ git pull origin develop退房后我需要做develop吗,还是已经做完了?

请帮助我了解clone远程有多个分支时的工作原理。

4

5 回答 5

18

简而言之,git clone repository-url按顺序执行以下操作:

  1. 创建一个新的空存储库。

    git init
    
  2. 创建一个名为“origin”的远程并将其设置为给定的 url。

    git remote add origin repository-url
    
  3. 从名为“origin”的远程获取所有提交和远程分支。

    git fetch --all
    
  4. 创建一个本地分支“master”来跟踪远程分支“origin/master”。

    git checkout --track origin/master
    

有趣的一点是,fork(在 GitHub 或 Bitbucket 中)只是服务器端的克隆。

于 2018-02-20T15:44:05.007 回答
13

git clone获取所有远程分支,但只master为您创建一个本地分支。因此,当您运行时git branch -a,您会看到如下内容:

$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/develop
  remotes/origin/master

这意味着您有一个本地分支master和多个远程分支。当你运行时git checkout develop,git 创建另一个本地分支develop跟踪远程分支origin/developgit尝试同步跟踪分支,因此您不必pullcheck out.

如果本地和远程分支术语让您感到困惑,您可以浏览此文档。它有一些很好的数据来帮助你理解它们,以及当你进一步提交时本地和远程分支是如何移动的。

您可能会发现这个答案很有帮助:如何在 Git 中克隆所有远程分支?,第一个答案。

于 2013-05-07T20:25:29.840 回答
10

git clone首先创建一个新的空存储库。(喜欢git init

然后它将给定的存储库设置为名为“origin”的远程。( git remote add)

然后主要工作由 完成git fetch,这是与其他存储库对话的唯一命令。它将远程存储库的所有提交转移到当前存储库,并在本地存储库中创建以“remote/origin/”开头的分支,与远程存储库上的分支相对应。

如果你有一个默认的非裸存储库,它也会调用git checkoutcheckout 通常是 master 分支。

如果您调用git branch -r它,它将向您显示“远程”分支,即您存储库中的那些分支,这些分支将以git fetch. (你从不直接处理这些。)

每当您想在您使用的分支上工作时git checkout,它将创建该分支的副本,没有“remote/origin/”前缀。这些是您工作的“本地”分支。(git branch将显示那些。)

您所做的几乎所有事情都只涉及您的本地存储库。唯一的例外是git push,这是更新远程存储库git fetch的唯一命令,也是查询其他存储库的唯一命令。

git pull只是 和 的git fetch组合git merge。第一个获取更改并更新 remote/origin/*,第二个将这些更改合并到您的本地分支中。

于 2013-05-07T20:46:01.990 回答
1

git clone默认获取存储库的所有分支。如果要检查所有分支,则需要克隆存储库的裸副本,取消设置裸标志并重置它。如果您还有其他问题,请告诉我。

于 2013-05-07T20:14:46.380 回答
1

当您克隆存储库时,您将获得所有分支以及可以从任何这些分支访问的所有提交。

但是,除了 master 之外,您不会获得任何其他分支的本地分支。其他的作为远程分支(远程/起源/开发)存在,您可以随时查看其中的任何一个。然后,git 将在远程分支和您在签出时创建的本地分支之间设置跟踪。

于 2013-05-07T20:27:46.830 回答