Git从入门到熟练第十讲 cloning

前言:

上一讲我们了解了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仓库。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值