git克隆的实际工作原理
我在Github上有一个存储库,它有两个分支:git克隆的实际工作原理,git,Git,我在Github上有一个存储库,它有两个分支:master和develope 当我克隆存储库并运行$git branch时,它只显示master分支。 如果我运行$git branch-a,我可以看到所有远程分支 现在,如果我执行$git checkout develope,我会得到以下消息: 分支机构开发设置用于跟踪远程分支机构从原点开发。 切换到一个新的分支“开发” 到底发生了什么?当我运行$git clone remote url时,或者当我运行:$git checkout develop
master
和develope
当我克隆存储库并运行$git branch
时,它只显示master
分支。如果我运行
$git branch-a
,我可以看到所有远程分支
现在,如果我执行$git checkout develope
,我会得到以下消息:
分支机构开发设置用于跟踪远程分支机构从原点开发。切换到一个新的分支“开发” 到底发生了什么?当我运行
$git clone remote url
时,或者当我运行:$git checkout develope
时,是否从远程develope
分支获取了提交
签出develope
后,我必须执行$git pull origin develope
,还是已经完成了
请帮助我了解当远程服务器上有多个分支时,
clone
是如何工作的。git clone
默认情况下获取存储库的所有分支。如果你想退房,你需要。如果您还有其他问题,请告诉我。git clone
获取所有远程分支,但只为您创建一个本地分支,master
。因此,当您运行git branch-a
时,您将看到如下内容:
$ git branch -a
* master
remotes/origin/HEAD
remotes/origin/develop
remotes/origin/master
这意味着您有一个本地分支master
和几个远程分支。当您运行git checkout develope
时,git将创建另一个本地分支develope
到远程分支origin/develope
git
尝试同步跟踪分支,这样您就不必在签出后执行另一次拉取操作
如果本地和远程分支术语听起来让您感到困惑,您可以浏览。它提供了一些很好的数据来帮助您理解它们,以及当您进一步提交时本地和远程分支是如何移动的
您可能会发现这个答案很有帮助:,第一个答案。克隆存储库时,您将获得所有分支以及可以从这些分支中访问的所有提交
但是,您将无法获得除master之外的任何其他分支的本地分支。其他分支作为远程分支(remotes/origin/development)存在,您可以随时查看其中的任何分支。然后git将在远程分支和您签出时创建的本地分支之间设置跟踪。git clone
首先创建一个新的空存储库。(如git init
)
然后,它将给定的存储库设置为一个名为“origin”的远程存储库。(git远程添加
)
然后,主要工作由git fetch
完成,这是与其他存储库对话的唯一命令。它将远程存储库的所有提交传输到当前存储库,并在本地存储库内创建以“remote/origin/”开头的分支,该分支与远程存储库上的分支相对应
git init
如果您有一个默认的非裸存储库,它还将调用git checkout
来签出主分支
如果调用git branch-r
,它将显示“远程”分支,即存储库中的那些分支,这些分支将通过git fetch
更新。(您从未直接处理过这些问题。)
每当您想在分支上工作时,都要使用git checkout
,它将创建该分支的副本,而不带“remote/origin/”前缀。这些是你工作的“本地”分支机构。(git分支
将显示这些。)
您所做的几乎所有事情都只涉及您的本地存储库。唯一的例外是git push
,它是更新远程存储库的唯一命令,而git fetch
是查询其他存储库的唯一命令
git pull
只是git fetch
和git merge
的组合。第一个获取更改并更新remote/origin/*,第二个将这些更改合并到本地分支。简单地说,git clone repository url
按顺序执行以下操作:
创建一个新的空存储库
git init
创建一个名为“origin”的远程服务器,并将其设置为给定的url
git remote add origin repository-url
从名为“源”的远程服务器获取所有提交和远程分支
创建本地分支“主”以跟踪远程分支“源/主”
有趣的一点是,fork(在GitHub或Bitbucket中)只是一个服务器端克隆 谢谢你们,各位。现在我明白了。因为它有最完整的解释,我接受这个答案。谢谢,这是有用的。一个小问题是,您说“git尝试同步跟踪分支,这样您就不必在签出后再进行另一次拉取”,这似乎表明签出将同步远程跟踪分支作为过程的一部分。情况并非如此,只有git-fetch
将从远程检索更新(或者git-pull
将fetch作为流程的第一部分)。签出仅使用远程分支的现有本地副本。远程跟踪仅将本地分支链接到远程,以简化拉取时的命令,它不添加任何同步。谢谢,这正是我要寻找的。这是一个很好的答案,但需要记录-第一步是对repo主目录执行mkdir
。
git checkout --track origin/master