我在Github上有一个包含2个分支的存储库:master
和develop
。
当我克隆存储库并运行$ 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
在远程有多个分支时的工作原理。
答案 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会创建另一个本地分支develop
到track远程分支origin/develop
。 git
尝试同步跟踪分支,因此您无需在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 fetch
和git merge
的组合。第一个提取更改并更新remote / origin / *,第二个将这些更改合并到您的本地分支。
答案 2 :(得分:6)
简而言之,git clone repository-url
按顺序执行以下操作:
创建一个新的空存储库。
git init
创建一个名为" origin"并将其设置为给定的URL。
git remote add origin repository-url
从远程调用" origin"获取所有提交和远程分支。
git fetch --all
创建本地分支" master"跟踪远程分支" origin / master"。
git checkout --track origin/master
一个有趣的观点是,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将设置远程分支与您在签出时创建的本地分支之间的跟踪。