前言:
上一讲我们了解了git分支合并和合并冲突,这里我们讲解git clone,即从源复制项目到本地,这是我们说明git远程协同合作功能中第一讲(一共四讲)。
课前准备:
https://download.csdn.net/download/qq_17204647/86969196
下载这个资源然后解压,运行文件make_math_repo.sh,在同一目录下会生成math文件夹,本章所有操作围绕这个文件夹展开。
10.1 git clone 复制源项目到本地
在git中,通过git clone克隆到本地的文件依旧和原先仓库保持链接(这也是和复制的区别),因此可以提交(push)和接收(pull)对这个仓库内容的修改。(如下图所示,文件的箭头表示git clone文件和源文件是有关系的)
10.1.1 git clone
git clone source destination_dir //克隆源文件到目标位置
其中source可以是URL或者是本地的文件位置,是的,git仓库也支持对本地源文件进行克隆。而我们这一讲的内容都是git对本地文件的克隆。
当我们进入math文件,想要切换到master分支时,发现提醒有错误,因为我们another_fix_branch有修改没有提交,我们可以提交修改或者用stash挂起,这里因为对后面没有啥影响,所以我直接先提交修改。
git commit -a -m "Adding a third variable"
git checkout master
回到上一目录,输入git clone指令
cd ..
git clone math math.clone1
这样我们就能发现目录下多了一个math.clone1文件夹。当然我们也能够通过git GUI实现这个操作,在没有git仓库的目录下,右击,
选择方框中选项,出现下图
输入源文件地址和克隆模板地址,也能够进行克隆。
10.1.2 克隆的分支
我们知道克隆的本地文件和源文件有链接,具体是怎么实现的却并不十分清楚,这里我们使用git branch命令来搞清楚git克隆分支是如何与源进行协同的。
首先,我们进入math文件,查看分支,如下图
然后我们进入math.clone1文件,查看分支,如下图
这个时候,我们也许会有疑问,为什么只有克隆的math.clone1文件只有一个master分支了?难道是git出问题了吗?
其实这是Git克隆的机制,当git克隆时,只会显示你克隆时源文件HEAD指针指向的分支(即如果你克隆时的源文件HEAD指向new_feature分支,那么克隆的本地文件也只会显示new_feature分支,有空可以尝试)
那么,其他分支难道就无法显示吗?
输入下面命令
git branch --all
结果如下图
底下显示的三个分支是克隆的远程源文件所有的三个分支,而它们被remotes/origin/保护,说明这些分支有一个名为origin的远程控制追踪。remote指的是克隆端到源文件中间的链接,详细的我会在下一章讲解。
因此,克隆的实际情况如下图
根据这个图,我们可以更形象的理解,刚刚我们克隆操作,分支的实际情况。除了master分支外,其他分支依旧处于名为origin的远程(remote)中,而本地如何访问这些分支?我会在下一小节介绍。
10.1.3 checking out branches
在git clone时,虽然只会显示克隆时源文件HEAD指针指向的分支,但是git仓库所有的记录都是一起被复制过来的,因此我们可以使用git checkout重建源文件中的所有分支。
git checkout another_fix_branch
输入命令后,我们得到git如下输出
我们同样通过图来解释这个输出的意思,
根据图像,我们可以看到,another_fix_branch分支有两个指针,一个是本地的another_fix_branch,另一个则是来自远程源文件的。
实际上,上一个git checkout another_fix_branch是下面命令的简写
git checkout -b another_fix_branch remotes/origin/another_fix_branch
这表示这里git checkout不单单是切换分支,而是以remotes/origin/another_fix_branch作为分支起点,创建了名为another_fix_branch的新分支。(对这个命令有些疑问的,可以回到第8讲分支创建进行回顾)
对这个概念的理解非常重要,因为如果你理解上面那张图,就可以理解origin是怎么存在于不同用户端,以及不同的人如何对远程源文件协同操作。
10.2 理解并使用裸仓库(bare repository)
在最开始几章中,我们讲解了在指定工作目录下创建git仓库,即隐藏的 .git 文件以及其工作目录。
裸仓库(bare repository)指的是除了git仓库不包含其他工作文件的仓库,可以通过git clone --bare来生成。
cd ..
git clone --bare math math.git //生成裸仓库
创建裸仓库,我们依旧先来分析图
git clone --bare是生成裸仓库的命令,因此 math.git 也就是裸仓库。从图中我们可以形象的知道git仓库目录几乎占了裸仓库的所有的空间,没有内存再放下你的工作目录文件。因此你不能对math.git有任何git命令操作,但是你可以克隆这个math.git目录或者向它提交修改。
11.2.1 克隆裸仓库
裸仓库有一个重要的特征,就是它没有指向源仓库(original repository)的指针,是一个完全独立的仓库。
而且它也没有工作目录,所占内存很小,因此我们需要克隆源文件时,常常使用源文件的裸仓库作为正式的仓库分享给其他用户(github 分享的clone链接也都是裸仓库)。
从裸仓库克隆命令如下
git clone math.git math.clone3
比较math.clone1和math.clone3,也可以打开两个文件,可以看出除了HEAD指针指向分支有差别,其他完全是一样的。
下图是不同的用户从math.git克隆,可以看到,git裸仓库克隆后生成的是工作目录+git仓库。文章来源:https://www.toymoban.com/news/detail-640532.html
文章来源地址https://www.toymoban.com/news/detail-640532.html
到了这里,关于Git从入门到熟练第十讲 cloning的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!