Skip to content

9.4 远程仓库 GitHub

前面介绍的仓库、分支、提交、标签等都是基于本地实现的,存在自己的电脑中。当团队协作时,我们需要把这些内容分享给其他同事,那么如何分享呢?

方式很简单,和项目部署一个道理。如果要与他人共享,就要在服务器上建立一个仓库,并在电脑端将本地仓库与之关联,然后将代码传上去供其他人获取。这个存在于服务端、与本地仓库内容同步的仓库就叫远程仓库。

Git 提供了搭建远程仓库的能力,不过我们这里不需要手动搭建,因为已经有一个极其完善、存放了全球开源项目的免费远程仓库 ——— GitHub。下面我们介绍如何在 GitHub 中创建自己的仓库。

9.4.1 创建远程仓库

首先搜索打开 GitHub 官网,如果你是初次使用,请注册一个账号,注册之后在首页中找到 “New” 按钮,点击之后进入创建仓库的页面,如图所示:

页面中输入仓库名称和描述,点击底部的 “Create repository” 按钮,一个远程仓库就创建好了。创建成功后会自动跳转到这个仓库的详情页,可以看到这是一个空仓库。此时我们直接复制浏览器地址栏中的地址,这个地址就是该远程仓库的地址。

远程仓库的地址非常重要,它不仅是一个唯一标识,也是与本地仓库关联和实现代码传输的通道。现在打开本地仓库,使用命令为其绑定我们刚才创建的远程仓库,方法如下:

sh
git remote add origin https://github.com/ruidoc/git_demo

上面命令将远程仓库地址绑定到本地仓库中,并命名为“origin”,这样两个仓库便建立了关联。之后在传输代码时,我们使用仓库名来代表远程仓库,比仓库地址更简单。

当然远程仓库并不是必须使用 “origin” 这个名字,他只是一个应用广泛的默认名称。一个本地仓库还可以关联多个远程仓库,但我们必须保证远程仓库名不能重复,否则关联就会混乱。

9.4.2 代码推送和拉取

远程仓库创建并与本地仓库关联后,我们要做的第一件事就是将本地代码推上去。推送代码使用 “git push” 命令实现,如下:

sh
$ git push -u origin master

这个命令的含义是:将本地仓库的 “master” 分支推送到远程仓库 “origin” 上。参数 -u 只在第一次推送时添加。命令执行后 master 分支的代码会被传上去,现在我们再看远程仓库的详情页,发现仓库中已经有代码了,并且代码和本地仓库同步。

  1. clone 与 pull

代码推送之后,相当于本地仓库的代码有了一个远程备份。现在即使我们手误删除了整个项目,你也不必担心代码丢失,因为你随时可以从远程仓库中再克隆一份。

假设另一位合作者要基于这份代码进行开发,他要做的第一件事是将这个仓库克隆下来,获取最新代码。克隆仓库使用 “git clone” 命令,如下:

sh
$ git clone https://github.com/ruidoc/git_demo

命令执行后代码会被下载到 git_demo 文件夹,此时本地仓库会自动创建,且自动与远程仓库关联,远程仓库默认被命名为 origin。假设此时远程仓库有了新的提交,该合作者还可以拉取最新代码完成同步。

从远程仓库拉取最新代码使用 “git pull” 命令实现,如下:

sh
$ git pull origin master

上面命令的含义是从远程仓库 “origin” 中拉取 “master” 分支的最新代码并更新到本地。命令执行后,本地代码会立即更新。不过有时候该操作也会出现代码冲突,需要我们解决冲突。

  1. fetch 与 merge

为什么执行 “git pull” 命令会出现冲突呢?原因很简单,因为它是以下两个命令的结合:

sh
$ git fetch
$ git merge origin/master

“git fetch” 表示获取最新的远程分支。远程分支拉取到本地后,会自动创建命名为 “origin/*” 的分支表示远程分支。假设本地分支是 master,那么对应的远程分支就是 “origin/master”。

当获取到 “origin/master” 分支的最新代码后,本地代码并不会更新,此时需要将 “origin/master” 分支合并到 “master” 分支,这与普通的分支合并无异,这样本地代码才会更新。

因此 “git pull” 是一个拉取且合并的组合操作,这样你就明白了远程分支在本地的存在形式,以及为什么拉取时会出现冲突了。

  1. 删除远程分支

当某个任务开发完成之后,你可能需要在本地仓库和远程仓库中同时删除这个分支。删除分支貌似是一个简单直观的操作,但是远程删除和本地删除却是不一样的思路。

假设现在本地仓库和远程仓库中都存在 “test” 分支,删除本地分支方法如下:

sh
$ git branch -d test

如果要删除远程分支,显然 “git branch” 命令无法奏效,因为该命令仅针对本地分支操作。对于远程分支来说,无论是创建、更新、删除,其实都是本地分支修改并推送后的结果。因此删除远程分支,同样是通过 “git push” 命令来实现。

如何将某次推送标记为删除呢?使用 -d 选项即可。删除远程 test 分支方法如下:

sh
$ git push -d origin test

执行完毕后,远程仓库中的 test 分支就被删除了。

9.4.3 远程 Tag 管理

在本地仓库中通过 pull 和 push 与远程仓库交换代码,可以使本地代码随时与他人共享。但这里有一个特殊情况,就是标签 Tag 并不会随着 push 分支而被推送到远程仓库。

如果要将标签推送到远程仓库,需要我们单独处理。假设现在本地仓库中有以下标签:

sh
$ git tag
v0.1.0
v0.2.0

下面分别是推送标签和删除标签的方法。

  1. 推送标签

将标签 v0.1.0 推送到远程仓库,其方式与推送分支基本一致,将分支名换成标签名即可:

sh
$ git push origin v0.1.0

如果要一次性推送所有标签,还有一个更简单的方法,就是使用 --tags 选项:

sh
$ git push origin --tags

该命令会自动把本地存在但远程不存在的所有标签推送到远程仓库。当其他人从仓库中克隆或拉取,他们也能获取到这些标签。

现在打开 GitHub 进入仓库,点击 “tags” 按钮,就可以看到远程仓库中的标签列表了。

  1. 删除标签

删除标签与删除分支的逻辑也基本一致,针对本地删除和远程删除有着不同的实现方式。首先删除本地标签 v0.1.0,方法如下:

sh
$ git tag -d v0.1.0

删除远程仓库中的标签同样使用推送的方式,命令如下:

sh
$ git push origin -d v0.1.0

9.4.4 远程提交与变更

团队协作开发的过程中,有一个非常关键的环节是审查代码。当有多个人推送代码到远程仓库后,作为审查人员你可以查看更新了哪些提交,某个提交的代码变更了什么。我们看如何在 GitHub 中查看提交,并且直观地看出文件的变化。

使用 “git show” 命令查看某个提交也可以看出文件变化,只不过是在终端展示,可读性比较差。

进入 GitHub 仓库详情页,可以看到页面主要部分如下图所示:

图中左上角圈住的部分是表示分支和标签的三个按钮,可以看到当前共有 2 个分支,1 个标签。第一个按钮点击可切换分支和标签,切换后代码区域就会变成当前分支或标签对应的代码。

图中右上角圈住的按钮表示当前分支的所有提交,可以看到一共有 6 个提交。点击按钮,会进入提交列表页,这里会根据提交时间将提交按天分组,方便我们检索,如图所示:

每个提交展示了提交描述和时间,右侧的 7 位字符是该提交的 commitId。有时候需要合并某个提交,可以在这里查找对应的 commitId。

点击提交描述,会进入该提交的详情页,这里就可以看到提交对应的代码变更了,如图所示:

提交详情可以看到哪些文件发生变更,变更的具体代码是什么。其中红色的以符号“-”开头的代码表示删除的代码,绿色的以“+”号开头的代码表示新增的代码,这样看起来代码变更一目了然。

将鼠标移动到某行代码,这行代码前会出现一个蓝色加号按钮,点击后会弹出一个评论框 ——— 没错,我们可以对变更的代码添加评论,这在多人互相评审代码时非常方便。