Git不完全操作指南之远程操作1——clone
概念与名词示意
-
远程仓库
远程仓库并不复杂, 在如今的云计算盛行的世界很容易把远程仓库想象成一个富有魔力的东西, 但实际上它们只是你的仓库在另个一台计算机上的拷贝。你可以通过因特网与这台计算机通信 —— 也就是增加或是获取提交记录
话虽如此, 远程仓库却有一系列强大的特性
-
首先也是最重要的的点, 远程仓库是一个强大的备份。本地仓库也有恢复文件到指定版本的能力, 但所有的信息都是保存在本地的。有了远程仓库以后,即使丢失了本地所有数据, 你仍可以通过远程仓库拿回你丢失的数据。
-
还有就是, 远程让代码社交化了! 既然你的项目被托管到别的地方了, 你的朋友可以更容易地为你的项目做贡献(或者拉取最新的变更)
现在用网站来对远程仓库进行可视化操作变得越发流行了(像 GitHub 或 Phabricator), 但远程仓库永远是这些工具的顶梁柱, 因此理解其概念非常的重要!
-
含义
clone命令从字面意思就是克隆,即从远程仓库拷贝一份副本到你的电脑上。换句话说就是:“在本地创建一个远程仓库的拷贝”。常用命令如下:
# git clone 远程仓库的地址
git clone https://github.com/ant-design/pro-components.git
# 执行完上述命令后,你遍可以在当前目录下找到一个`pro-components`的文件夹,
# 这就是拷贝下来的远程仓库副本,你可以基于这个副本进行开发
# 当然,你也可以指定你要把项目副本克隆到哪里
git clone https://github.com/ant-design/pro-components.git ./gitdemo
# 如上,执行完上述命令,你会发现我们的远程仓库副本被创建到`gitdemo`目录,
# 而非`pro-components`
远程分支
通过上面的clone操作我们已经创建了一个远程仓库的本地副本了。那么在创建本地副本之后,我们的远程分支有没有什么变化呢?大家来观察一下下面这张图:
图中实线部分为本地仓库,而虚线部分为clone下来的远程仓库。我们可以看到,本地仓库出了多出来了的一个o/main之外,几乎与远程仓库没什么区别。那么,这个o/main是什么呢?
图中的o/main其实就是main分支的远程分支。由于远程分支的特性导致其拥有一些特殊属性。远程分支反映了远程仓库(在你上次和它通信时)的状态。这会有助于你理解本地的工作与公共工作的差别 —— 这是你与别人分享工作成果前至关重要的一步.
远程分支有一个特别的属性,在你检出时自动进入分离 HEAD 状态(即头指针不指向任何的一个分支,而是处于游离状态,正常情况我们的头指针是跟随者分支一起移动的,这个我们后面再细说,如果感兴趣,可以自行搜索一下“分离头指针”)。Git 这么做是出于不能直接在这些分支上进行操作的原因, 你必须在别的地方完成你的工作, (更新了远程分支之后)再用远程分享你的工作成果。
那么,在远程分支名当中的o/是什么意思呢?这就要说一下我们远程分支的命名规范了:
# 远程分支命名规范
<remote name>/<branch name>
# 我们在现实开发中,可能更多的看到类似这样的远程分支名
origin/main
# 这是因为我们已经在远程仓库设置好了`remote name`为`origin`了。
检出远程分支
当我们需要针对某一个远程分支进行开发时,我们需要先将该远程分支检出到本地,在这个检出的本地分支上开发,而这个本地分支的远程就是我们的目标远程分支,例如:
# 远程分支
origin/feature/code-op
# 检出远程分支到本地
git checkout origin/feature/code-op
# 当然,如果你的远程仓库的remote name是origin的话,可以省略不写
git checkout feature/code-op
# 这样你就在本地拥有了一个与远程分支相关联的分支了,你的任何修改,在没有推送之前,由于
# 处于头指针分离状态,都不会影响远程分支,只有当你推送之后,远程分支才会相应的更新。
如上图,我们为执行以下命令的结果:
# 将远程分支o/main检出到本地
git checkout o/main;
# 增加一次提交
git commit -m "C2"
执行了上述两个命令后,我们可以看到我们的HEAD指针不再跟着我们的分支,而是指向最后一次的提交,这其实就是头指针分离的效果。
并且,我们可以看到,即使我们在检出来的分支上进行了提交,并没有影响到我们的远程分支。这是因为 o/main 只有在远程仓库中相应的分支更新了以后才会更新。