git clone实际上是如何工作的

时间:2013-05-07 20:05:19

标签: git

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

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

现在,如果我做$ git checkout develop,我会收到消息:

  

分支开发设置跟踪远程分支从原点发展   切换到新的分支'develop'

究竟发生了什么?当我运行develop时,或者当我运行$ git clone remote-url时,或者两者都未提取来自远程{{​​1}}分支的提交?

签出$ git checkout develop后,我是否需要$ git pull origin develop,或者已经完成了?{/ p>

请远程了解develop在远程有多个分支时的工作原理。

5 个答案:

答案 0 :(得分:12)

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

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

表示您有一个本地分支master和几个远程分支。当您运行git checkout develop时,git会创建另一个本地分支developtrack远程分支origin/developgit尝试同步跟踪分支,因此您无需在pull之后再执行check out

如果本地和远程分支机构的术语听起来很混乱,您可以浏览this document。它有一些很好的数字可以帮助您理解它们,以及当您进一步提交时本地和远程分支如何移动。

您可能会发现此答案有用:How to clone all remote branches in Git?,第一个答案。

答案 1 :(得分:7)

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

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

主要工作由git fetch完成,这是与其他存储库通信的唯一命令。它将远程存储库的所有提交传输到当前存储库,并在本地存储库分支内创建,从与远程存储库上的分支对应的“remote / origin /”开始。

如果您有一个默认的非裸存储库,它也会调用git checkout来检查通常是主分支。

如果您致电git branch -r,它会向您显示“远程”分支,即您的存储库中的分支,这些分支将由git fetch更新。 (你永远不会直接研究它们。)

每当您想要在分支上工作时,使用git checkout将创建该分支的副本,而不使用“remote / origin /”前缀。这些是您工作的“本地”分支机构。 (git branch会显示这些内容。)

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

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

答案 2 :(得分:6)

简而言之,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
    
  5. 一个有趣的观点是,fork(在GitHub或Bitbucket中)只是服务器端克隆。

答案 3 :(得分:1)

git clone默认提取存储库的所有分支。如果您想查看all branches,则需要clone a bare copy of the repository, unset the bare flag and reset it。如果您还有其他问题,请与我们联系。

答案 4 :(得分:1)

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

但是,您将无法获得除master之外的任何其他分支的本地分支。其他的那些作为远程分支(远程/起源/开发),你可以随时查看任何这些。然后git将设置远程分支与您在签出时创建的本地分支之间的跟踪。