内容纲要

🗂 | 查看 Git 专题可浏览更多内容


在使用版本控制系统时,大部分的操作都在「本地仓库」进行,但当需要与团队协作进行数据共享时,就需要「远程仓库」了。

克隆一个远程仓库

假设现在已经有一个存放在远程服务器中的并且已经被纳入版本控制系统中的项目,只需要获得项目远程仓库 的 URL 地址就可以克隆到本地。

这个 URL 可能采用如下形式:

获得到 URL 后使用 git clone 命令,如:

# 如果有必要,先使用 cd 命令进入到想要放置项目的目录:
$ cd <目录名>

$ git clone https://example.com/git-repo.git

这样项目就会克隆到本地计算机上了。

查看远程仓库信息

$ git remote -v
origin  https://example.com/git-repo.git (fetch)
origin  https://example.com/git-repo.git (push)

当克隆一个远程仓库的同时,Git 会自动记录其链接。默认使用「origin」来标识所克隆的原始仓库。

每个远程仓库包含两行:

  • fetch:用来进行抓取的 URL;
  • push:用来把本地仓库中的数据推送到远程仓库的 URL;

很多情况下这两个 URL 都是相同的,但出于安全或性能等方面的考虑,可以对抓取和推送的设置不同的 URL 地址。

此外可以对一个本地仓库设置很多个远程链接,这是没有数量限制的。

连接一个远程仓库

连接一个远程仓库可以使用命令 git remote add [<选项>] <名称> <地址>,如:

$ git remote add new-remote-repo https://new-example.com/git-repo.git

此处在当前项目连接了一个新的远程仓库,仓库地址为「https://new-example.com/git-repo.git」 ,而仓库名自定义为「new-remote-repo」,它就相当于克隆后 Git 默认创建的「origin」。

再次使用命令 git remote

$ git remote -v
new-remote-repo https://new-example.com/git-repo.git (fetch)
new-remote-repo https://new-example.com/git-repo.git (push)
origin  https://example.com/git-repo.git (fetch)
origin  https://example.com/git-repo.git (push)

可以看到,除了克隆后 Git 为我们创建的「origin」,还新增了刚才添加的「new-remote-repo」。

抓取远程仓库数据

在连接到远程仓库后,还需要对远程仓库进行数据更新,因为与远程仓库仅仅是建立了连接关系,还没有进行任何数据交换。

Git 会在你的本地仓库中保存远程数据的信息(例如分支,提交等等)。但是它并不是实时地连接到的远程仓库上的。

# 查看所有分支
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

如上,此时只有「origin」的远程分支信息。

接着使用 git fetch 命令更新「new-remote-repo」远程仓库的信息:

$ git fetch new-remote-repo

$ git branch -a
* master
  remotes/new-remote-repo/master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

现在可以看到「new-remote-repo」上的分支信息了。

远程跟踪分支

假设当前有一个远程仓库的信息上这样的:

* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/dev
  remotes/origin/master

我们需要在在该远程仓库的「dev」分支上进行工作,但是现在它只是一个远程分支的指针。为了能够真正地在这个分支上工作,并且切换当前工作副本的内容,我们需要创建一个基于这个远程的本地分支。

# 创建一个名为 dev 的本地分支
$ git branch dev
# 将分支 'dev' 设置为跟踪 'origin/dev'
$ git branch --set-upstream-to=origin/dev dev

# 在旧版 Git 上会使用另一个命令创建并跟踪:
$ git checkout --track origin/dev

如此,它会在新的本地分支和它所位于的远程分支之间创建一个跟踪联系「tracking relationship」。

跟踪分支主要是为了让我们得知本地分支和远程分支的状态,即:

  • 如果本地分支上提交了一些改动,且没有发布它和推送到远程仓库中。相对于这些提交来说的本地分支就「领先(ahead)」于那些它所对应的远程分支。
  • 如果团队的其他开发人员提交并且发布了一些改动到远程仓库中,这时远程仓库就拥有了那些你还没有下载到本地仓库的提交。你的本地仓库就「落后(behind)」于它所关联的远程仓库。

举个例子,在追踪远程分支后,在本地分支上对一个文件进行改动并提交,此时查看状态:

$ git status
位于分支 dev
您的分支领先 'origin/dev' 共 1 个提交。
  (使用 "git push" 来发布您的本地提交)

无文件要提交,干净的工作区

可以看到提示「您的分支领先 ‘origin/dev’ 共 1 个提交。」

推送改动至远程仓库

$ git push

因为之前已经建立了跟踪关系,否则需要使用参数表明要将改动推送至哪个远程仓库的哪个分支上:

# git push <远程仓库名> <远程仓库上的分支>
$ git push origin dev

拉取远程仓库的改动

$ git pull

git pull 命令将会从远程分支下载所有的新的提交到你的本地副本中来。

它实际上就是一个「抓取(fetch)」命令(下载数据) 和 一个「合并(merge)」命令(整合那些下载的数据到你的本地副本)的组合。

git push 命令一样,如果你本地的 HEAD 分支还没有创建任何一个「跟踪」链接,你就必须告诉 Git,你要从哪一个远程仓库上的哪一分支中抓取数据(例如 git pull origin master)。如果已经存在了一个链接,只需要简单键入 git pull 就足够了.

整合的目标并不基于存在什么样的跟踪链接,它总是会被整合到你的本地 HEAD 分支中,也就是你的工作副本。

调和分离的分支

在新版本 Git 中,当出现偏离的分支时会遇到这样的提升:

提示:您有偏离的分支,需要指定如何调和它们。您可以在执行下一次
提示:pull 操作之前执行下面一条命令来抑制本消息:
提示:
提示:  git config pull.rebase false  # 合并
提示:  git config pull.rebase true   # 变基
提示:  git config pull.ff only       # 仅快进
提示:
提示:您可以将 "git config" 替换为 "git config --global" 以便为所有仓库设置
提示:缺省的配置项。您也可以在每次执行 pull 命令时添加 --rebase、--no-rebase,
提示:或者 --ff-only 参数覆盖缺省设置。

你需要为分支的合并方式作出设置:

# 合并,先尝试 fast-forward,如果快速合并失败则使用正常合并
$ git config pull.rebase false

# 变基
$ git config pull.rebase true

# 仅快进 fast-forward
$ git config pull.ff only

或是每次执行使命时带上选项:

$ git pull [--rebase | --no-rebase | --ff-only]

推送一个远程仓库没有的本地分支

# 创建一个名为 dev 的分支并切换
$ git branch dev

# 然后指定远程仓库同名分支
$ git push -u origin dev

保持相同的分支名在本地和其对应的远程分支是非常有必要的。

-u 参数会自动地在本地的分支和新建的远程分支之间创建一个「跟踪」链接。

$ git branch -vva
  dev                   5505ae5 [origin/dev] Initial commit
* master                5505ae5 [origin/master] Initial commit
  remotes/origin/HEAD   -> origin/master
  remotes/origin/dev    5505ae5 Initial commit
  remotes/origin/master 5505ae5 Initial commit

删除分支

如果一个主题分支的工作已经完成了,需要删除本地分支以及解除与远程分支的关联:

# -d, --delete
$ git branch -d dev

# -r, --remotes 作用于远程跟踪分支
$ git branch -dr origin/dev

如果需要删除远程仓库上的分支:

# git push <remote> --delete <branch>
$ git push origin -d dev

⚠️ 注意:对于远程仓库的操作都需要谨慎以免出错。

小结

  • 使用 git clone 命令可用于克隆一个远程仓库上的项目;
  • 使用 git remote 命令可用于管理远程仓库;
  • 使用 git fetch 命令可用于抓取远程仓库的数据;
  • 使用 git push 命令可用于推送更改至远程仓库;
  • 使用 git pull 命令用于拉取远程仓库的改动,git pull 命令相当于 git fetch + git merge 命令的组合;