【Git】原理及使用(四) (远程操作)

分布式版本控制系统

可以理解成:每个人电脑上都有一份完整的代码仓库,包括所有版本历史,而不是只依赖一台中央服务器。

在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能两人不在一个局域网内,两台电脑互相访问不了。因此,分布式版本控制系统通常也有一台充当"中央服务器"的电脑,但这个服务器的作用仅仅是用来方便"交换"大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

Git 就是典型的分布式版本控制系统。

远程仓库

同一个Git仓库可以分布到不同的机器上。怎么分布呢?最早只有一台机器有一个原始版本库,此后,别的机器可以"克隆"这个原始版本库,而且每台机器的版本库其实都是一样的,并没有主次之分。

你肯定会想,至少需要两台机器才能玩远程库不是?但是我只有一台电脑,怎么玩?

其实一台电脑上也是可以克隆多个版本库的,只要不在同一目录下。不过,现实生活中是不会有人这么傻在一台电脑上搞几个远程库玩,因为一台电脑上搞几个远程库完全没有意义,而且硬盘挂了会导致所有库都挂掉,所以这里不介绍在一台电脑上怎么克隆多个仓库。

实际情况往往是找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个"服务器"仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。

完全可以自己搭建一台运行Git的服务器,不过现阶段,为了学Git先搭个服务器小题大作。好在这个世界上有个叫GitHub的网站,这个网站就是提供Git仓库托管服务的。所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。

我们这里用gitee作示例。

从创建好的远程仓库中我们便能看到,之前在本地学习过的分支,也存在于远程仓库中并被管理起来了。刚创建的仓库有且只有一个默认的master分支。

克隆远程仓库

克隆/下载远端仓库到本地,需要使用 git clone 命令,后面跟上我们的远端仓库的链接,远端仓库的链接可以从仓库中找到:选择"克隆/下载"获取远程仓库链接.

SSH协议和HTTPS协议是Git最常使用的两种数据传输协议。SSH协议使用了公钥加密和公钥登录机制,体现了其实用性和安全性,使用此协议需要将我们的公钥放上服务器,由Git服务器进行管理。使用HTTPS方式时,没有要求,可以直接克隆下来。

  • 使用HTTPS方式:

    使用SSH方式:

    使用SSH方式克隆仓库,由于我们没有添加公钥到远端库中,服务器拒绝了我们的clone链接。需要我们设置一下:
    第一步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa 和 id_rsa.pub 这两个文件,如果已经有了,可直接跳到下一步。如果没有,需要创建SSH Key:
    (输入邮箱,然后一路回车,使用默认值即可)

    id_rsa 和 id_rsa.pub 两个文件,这两个就是SSH Key的秘钥对, id_rsa 是私钥,不能泄露出去, id_rsa.pub 是公钥,可以放心地告诉任何人。
    第⼆步:添加自己的公钥到远端仓库。

    至此,准备工作全部做完,可以开始clone了。

    如果有多人协作开发,GitHub/Gitee允许添加多个公钥,只要把每个人的电脑上的Key都添加到GitHub/Gitee,就可以在每台电脑上往GitHub/Gitee上提交推送了。
    当我们从远程仓库克隆后,实际上Git会自动把本地的master分支和远程的master分支对应起来,并且,远程仓库的默认名称是origin。在本地我们可以使用 git remote 命令来查看远程库的信息(或用git remote -v显示更详细的信息),如:

    向远程仓库推送
    本地已经 clone 成功远程仓库后,我们便可以向仓库中提交内容,例如新增一个 file.txt 文件:

    提交时要注意,如果我们之前设置过全局的name和e-mail,这两项配置需要和gitee上配置的用户名和邮箱一致,否则会出错。若从来没有设置过全局的name和e-mail,那么第一次提交时也会报错。这就需要我们重新配置,同样要注意需要和gitee上配置的用户名和邮箱一致。如何配置已讲过,这里不再赘述。
    到此我们已经将内容提交至本地仓库中,接下来将本地仓库的内容推送至远程仓库呢,需要使用 git push 命令。
    该命令用于将本地的分支版本上传到远程并合并,命令格式如下:

    git push <远程主机名> <本地分支名>:<远程分支名>
    若本地和远程分支名相同,则可以省略冒号:
    git push <远程主机名> <本地分支名>

此时我们将本地的master分支推送到origin主机的master分支:

推送成功!这里由于我们使用的是SSH协议,不用每一次推送都输入密码的,方便我们的推送操作。如果用的是HTTPS协议,每次推送都必须输入口令。

接下来,看看gitee远端:

代码已被推送到远端:

拉取远端仓库

在gitee上点击README.md文件并在线修改它:

此时,远程仓库是要领先于本地仓库一个版本,为了使本地仓库保持最新的版本,我们需要拉取下远端代码,并合并到本地。Git提供了 git pull 命令,该命令用于从远程获取代码并合并本地的版本。格式如下:

复制代码
git pull <远程主机名> <远程分支名>:<本地分支名>
若远程分支是与当前分支合并,则冒号后面的部分可以省略。
git pull <远程主机名> <远程分支名>