2. 远程仓库的基础操作

本节将介绍添加、移除远程仓库,以及获取 Git 远程仓库的提交信息等基本操作。

在上一章中,我们使用 git clone https://gitee.com/weimz/py2048.git 命令将魏明择用 Python 语言写的 2048 游戏的开源代码从远程仓库克隆到了本地。本地仓容的文件夹是 py2048,我们可以使用 git remote 命令查看本地仓库 py2048 中设置的远程仓库的信息。如下:

weimingze@mzstudio:~$ cd py2048/
weimingze@mzstudio:~/py2048$ git remote
origin

上面 origin 就是远程仓库的名称(Git默认名称,并可以修改)。此名称对应的就是远程仓库 https://gitee.com/weimz/py2048.git。我们还可以使用 git remote -v 来查看更详细的信息,如下所示:

weimingze@mzstudio:~/py2048$ git remote -v
origin  https://gitee.com/weimz/py2048.git (fetch)
origin  https://gitee.com/weimz/py2048.git (push)

可见名称 origin 就是远程仓库 https://gitee.com/weimz/py2048.git 的别名。其中此远程仓库 origin 的获取(fetch)地址是 https://gitee.com/weimz/py2048.git,推送(push)地址也是 https://gitee.com/weimz/py2048.git

一个本地仓库可以拥有不止一个远程仓库。默认如果你是从一个远程仓库克隆出来的本地仓库,那么这个远程仓库默认的名称是 origin 对应的远程仓库就是你指定的远程仓库的链接地址(URL)。我们可以为一个本地仓库添加多个远程仓库,这样我们就可以从远程仓库获取代码,也可以将自己编写的代码文件推送到其它的远程仓库。

如我已经分享在码云上的远程仓库有如下几个:

项目名称
仓库地址
2048
https://gitee.com/weimz/py2048.git
飞机大战
https://gitee.com/weimz/plane_war.git
编程电子书
https://gitee.com/weimz/books.git

以上远程仓库对所有人只读。

添加远程仓库

在本地仓库中,使用 git remote add 命令可以将远程仓库添加到本地仓库。同时可以为此远程仓库的 URL 取一个别名,方便后续使用。

git remote add 命令

格式:

git remote add 简短别名 远程仓库URL地址

示例:

下面将飞机大战的远程仓库加入到 py2048 本地仓库,同时取别名为 planewar

weimingze@mzstudio:~/py2048$ git remote add planewar https://gitee.com/weimz/plane_war.git
weimingze@mzstudio:~/py2048$ git remote -v
origin  https://gitee.com/weimz/py2048.git (fetch)
origin  https://gitee.com/weimz/py2048.git (push)
planewar    https://gitee.com/weimz/plane_war.git (fetch)
planewar    https://gitee.com/weimz/plane_war.git (push)

可见项目中多了一个别名为 planewar 的远程仓库,这个远程仓库是 https://gitee.com/weimz/plane_war.git

从远程仓库中获取数据

现在我们已经设置了另外一个远程仓库 planewar但远程仓库的内容并没有放入到本地仓库中。下面我们使用 git fetch 命令来获取 planewar 远程仓库的内容并形成本地仓库中的一个或多个分支。

git fetch 命令

这个命令的作用是从远程仓库中抓取所有仓库中的内容,并形成本地仓库的一个分支,比如 planewar 内、内部只有一个 master 分支。则使用 git fetch planewar 命令后,本地就会多一个 planewar/master 分支。这个远程分支我们可以使用 git branch -r 命令进行查看。

命令格式

 git fetch 远程仓库名

示例:

从远程仓库抓取数据到本地仓库。在抓取前我们使用 git branch -r查看 py2048 本地仓库的所有分支,包含远程分支如下。

weimingze@mzstudio:~/py2048$ git branch -r
  origin/HEAD -> origin/master
  origin/master

我们看到目前本地仓库中只有一个 origin 远程仓库的 master 分支,其中 origin/HEAD 是 远程仓库的默认分支指针,它指向 origin/master,这个我们不用理会。

下面我行使用 git fetch planewar 将远程仓库 planewar 的所有分支抓取到本地。

weimingze@mzstudio:~/py2048$ git fetch planewar
remote: Enumerating objects: 174, done.
remote: Counting objects: 100% (35/35), done.
remote: Compressing objects: 100% (34/34), done.
remote: Total 174 (delta 8), reused 2 (delta 0), pack-reused 139 (from 1)
Receiving objects: 100% (174/174), 1.55 MiB | 1.22 MiB/s, done.
Resolving deltas: 100% (31/31), done.
From https://gitee.com/weimz/plane_war
 * [new branch]      master     -> planewar/master
 * [new tag]         v0.1       -> v0.1
 * [new tag]         v0.2       -> v0.2
weimingze@mzstudio:~/py2048$ git branch -r
  origin/HEAD -> origin/master
  origin/master
  planewar/master

从运行结果可以看出本地仓库多了一个 planewar/master 分支,同时多了两个标签 v0.1v0.2 这是 planewar 远程仓库中的标签也被抓取到了本地仓库中。

从远程仓库提取代码到工作区

执行了上述操作后,我们工作区的代码并没有发生变化。下面我们使用 git restore 命令将 planewar/master 分支中的最后一次提交的文件还原到工作区。

注意工作区中的文件会被清除,请提前做好备份或保存到暂存区。

命令如下:

git restore --source=planewar/master --worktree .

执行结果如下:

weimingze@mzstudio:~/py2048$ ls
2048game.py  README.md  images
weimingze@mzstudio:~/py2048$ git restore --source=planewar/master --worktree .
weimingze@mzstudio:~/py2048$ ls
LICENSE  README.md  game  images  main.py

上述工作区中 main.pyREADME.mdLICENSE 就是远程仓库 planewar 中的文件,其中的gameimages是文件夹。我们使用 git status 就能查看到这些文件的状态,并且 main.pyLICENSEgame.gitignore都是未跟踪状态。接下来我们使用 git restore --worktree . 还原为原来的工作区。

执行结果如下:

weimingze@mzstudio:~/py2048$ git restore --worktree .
weimingze@mzstudio:~/py2048$ ls
2048game.py  LICENSE  README.md  game  images  main.py

可见 2048game.pyREADME.mdimages 中的文件又回来了。因为当前还是在本地仓库的主分支 master 中。

查看某个远程仓库

在使用远程仓库时。我们可以使用 git remote show <远程仓库名> 命令来查看远程仓库更过的信息。

如下面使用 git remote show 查看 origin 的信息。

weimingze@mzstudio:~/py2048$ git remote show origin
* remote origin
  Fetch URL: https://gitee.com/weimz/py2048.git
  Push  URL: https://gitee.com/weimz/py2048.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

上述信息会显示当前远程仓库 origin 的获取地址和推送地址,并且只有一个分支 master,此时当前操作位置指针 HEAD 位于 master 分支。为 'git pull'(后面会讲) 设置的本地分支为本地 master 与远程 master 合并。为 git push(后面会讲)设置的本地引用为 master 推送至远程 master (最新)。

远程仓库的重命名

使用 git remote rename 命令可以将一个已有的远程仓库名改名。

命令用法

git remote rename 旧名称 新名称

如我将上述远程仓库名 planewar 改为 pw则命令为 git remote rename planewar pw,如果再改回来,只需要将新旧名称对调即可。

示例:

weimingze@mzstudio:~/py2048$ git remote
origin
planewar
weimingze@mzstudio:~/py2048$ git remote rename planewar pw
Renaming remote references: 100% (1/1), done.
weimingze@mzstudio:~/py2048$ git remote
origin
pw
weimingze@mzstudio:~/py2048$ git remote rename pw planewar
Renaming remote references: 100% (1/1), done.
weimingze@mzstudio:~/py2048$ git remote
origin
planewar

上面的示例改了远程仓库planewar 的名字为 pw后,又将名字改回来了。

远程仓库的移除

我们在本地仓库中加入了远程仓库。当我们不在使用时,可以使用 git remote remove <远程仓库名> 命令移除远程仓库。

需要注意的是,你一旦使用这种方式移除了一个远程仓库,那么所有和这个远程仓库相关的远程分支以也会被一起删除。

示例:

删除远程仓库 planewar

weimingze@mzstudio:~/py2048$ git remote
origin
planewar
weimingze@mzstudio:~/py2048$ git branch -r
  origin/HEAD -> origin/master
  origin/master
  planewar/master
weimingze@mzstudio:~/py2048$ git remote remove planewar
weimingze@mzstudio:~/py2048$ git remote
origin
weimingze@mzstudio:~/py2048$ git branch -r
  origin/HEAD -> origin/master
  origin/master

可见远程仓库 planewar 被移除后,远程分支 planewar/master 也同时被移除了。

实验:

  1. 将远程仓库 https://gitee.com/weimz/books.git 添加到你的本地仓库,取别名为 books
  2. 抓取远程仓库 books 中的全部内容到工作区中。
  3. 删除远程仓库 books