Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git克隆的实际工作原理_Git - Fatal编程技术网

git克隆的实际工作原理

git克隆的实际工作原理,git,Git,我在Github上有一个存储库,它有两个分支:master和develope 当我克隆存储库并运行$git branch时,它只显示master分支。 如果我运行$git branch-a,我可以看到所有远程分支 现在,如果我执行$git checkout develope,我会得到以下消息: 分支机构开发设置用于跟踪远程分支机构从原点开发。 切换到一个新的分支“开发” 到底发生了什么?当我运行$git clone remote url时,或者当我运行:$git checkout develop

我在Github上有一个存储库,它有两个分支:
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