git clone如何实际工作
我在Github上有一个有两个分支的仓库: master
和develop
。
当我克隆版本库并运行$ git branch
它只显示master
分支。
如果我运行$ git branch -a
我可以看到所有的远程分支。
现在,如果我执行$ git checkout develop
,我会收到以下消息:
分支机构开展设置,以追踪远程分支从原产地发展。
切换到一个新的分支'发展'
究竟发生了什么? 当我运行$ git clone remote-url
,或者当我运行$ git checkout develop
或者两者都没有时,从远程develop
分支提交的内容会被提取?
在检查$ git pull origin develop
之后,我是否要做一个$ git pull origin develop
develop
,或者它已经完成了?
请帮助我了解在远程有多个分支时clone
是如何工作的。
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/develop
。 git
尝试同步跟踪分支,所以你不必在check out
后再做一次pull
。
如果本地和远程分支术语听起来令您感到困惑,则可以浏览此文档。 它有一些很好的数字来帮助你理解它们,以及当你进一步提交时本地和远程分支机构如何移动。
您可能会发现这个答案有帮助:如何克隆Git中的所有远程分支?,第一个答案。
git clone
首先创建一个新的空库。 (比如git init
)
然后它将给定的存储库设置为称为“原点”的远程。 ( git remote add
)
主要工作是通过git fetch
来完成的, git fetch
是与其他存储库交谈的唯一命令。 它将远程存储库的所有提交转移到当前存储库,并在远程存储库上的分支所对应的“remote / origin /”开始的本地存储库分支内创建。
如果你有一个默认的非裸仓库,它也会调用git checkout
来检查通常的master分支。
如果您调用git branch -r
它会向您显示“远程”分支,即存储库中的那些分支,这些分支将通过git fetch
更新。 (你从来没有直接对这些工作。)
每当你想在分支上工作时,你都会使用git checkout
来创建该分支的副本,而不需要“remote / origin /”前缀。 那些是你工作的“当地”分支。 ( git branch
会显示那些。)
几乎所有你做的事情都只涉及你的本地仓库。 唯一的例外是git push
,这是更新远程仓库的唯一命令,而git fetch
是查询其他仓库的唯一命令。
git pull
只是git fetch
和git merge
的组合。 第一个获取更改并更新remote / origin / *,第二个将这些更改合并到本地分支中。
git clone
默认获取版本库的所有分支。 如果您想检出所有分支,则需要克隆存储库的裸副本,取消设置裸标志并将其重置。 让我知道你是否还有其他问题。