git clone实际上是如何工作的

Tam*_*Pap 12 git

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

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

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

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

究竟发生了什么?develop当我跑步时$ git clone remote-url,或者当我跑步时,是否从远程分支获取了提交:$ git checkout develop或者两者都没有?

$ git pull origin develop退房后我要做一个develop,或者它已经完成了吗?

请帮助我了解clone遥控器上有多个分支时的工作原理.

Yan*_*ang 12

git clone获取所有远程分支,但只master为您创建一个本地分支.所以当你跑步时git branch -a,你会看到这样的事情:

$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/develop
  remotes/origin/master
Run Code Online (Sandbox Code Playgroud)

这意味着您有一个本地分支master和几个远程分支.当你运行时git checkout develop,git创建另一个本地分支develop跟踪远程分支origin/develop.git尝试同步跟踪的分支,所以你不必做另一个pull之后check out.

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

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


mic*_*has 7

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 fetchgit merge.第一个提取更改并更新remote/origin/*,第二个将这些更改合并到本地分支中.


rou*_*ble 7

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

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

    git init
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建一个名为“ origin”的远程并将其设置为给定的url。

    git remote add origin repository-url
    
    Run Code Online (Sandbox Code Playgroud)
  3. 从称为“源”的远程获取所有提交和远程分支。

    git fetch --all
    
    Run Code Online (Sandbox Code Playgroud)
  4. 创建本地分支“ master”以跟踪远程分支“ origin / master”。

    git checkout --track origin/master
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 这是一个很好的答案,但需要记录一下 - 第一步是存储库主目录的“mkdir”。 (2认同)