fetch 与引用规格(refspec)—— Git 学习笔记 23

fetch 与引用规格(refspec)

本文想讨论 fetch 命令的细节。

假设我们用命令添加了一个远程版本库:

$ git remote add origin https://github.com/schacon/simplegit-progit

上述命令会在 .git/config 文件中添加几行,并在其中指定远程版本库名称(origin)、URL 和一个用于获取(fetch)操作的引用规格(refspec):

[remote "origin"]
	url = https://github.com/schacon/simplegit-progit
	fetch = +refs/heads/*:refs/remotes/origin/*

第1行:表示远程仓库的简称是 origin

第2行:指明远程仓库的 URL;

第3行:引用规格的格式由一个可选的 + 号和紧随其后的 <src>:<dst> 组成。其中

  • <src> 是一个模式(pattern),代表远程版本库中的引用;
  • <dst> 是远程版本库的引用在本地所对应的位置;
  • 开头的 + 号告诉 Git 即使在不能快进的情况下也要(强制)更新引用。

默认情况下,引用规格由 git remote add 命令自动生成, Git 会获取服务器中 refs/heads/ 下面的所有引用,并将它写入到本地的 refs/remotes/origin/ 中。

如果运行git fetch 命令,示意图如下(命令中的灰色部分是默认参数):
在这里插入图片描述

所以,如果服务器上有一个 master 分支,我们可以在本地通过下面这种方式来访问该分支上的提交记录:

$ git log origin/master
$ git log remotes/origin/master
$ git log refs/remotes/origin/master

上面的三个命令作用相同,因为 Git 会把它们都扩展成 refs/remotes/origin/master

如果想让 Git 每次只拉取远程的 master 分支,而不是所有分支,可以把上文引用规格的第 3 行修改为:

fetch = +refs/heads/master:refs/remotes/origin/master

这也是针对远程版本库 origingit fetch 操作的默认引用规格。

对于那些只执行一次的 fetch 操作,我们可以在命令行指定引用规格。 比如,只想将远程的 master 分支抓取到本地的 origin/master 分支,可以运行:

$ git fetch origin master:refs/remotes/origin/master

也可以在命令行中按照如下的方式抓取多个分支:

$ git fetch origin master:refs/remotes/origin/master \
	 topic:refs/remotes/origin/topic
From git@github.com:schacon/simplegit
 ! [rejected]        master     -> origin/master  (non fast forward)
 * [new branch]      topic      -> origin/topic

在这个例子中,对 master 分支的抓取操作被拒绝,因为它不是一个可快进的引用。 可以在引用规格之前指定 + 号来强制抓取。例如:

$ git fetch origin +master:refs/remotes/origin/master \
	 topic:refs/remotes/origin/topic

上面的命令表示,对于远程仓库的 master 分支,会强制抓取到本地,但是对于 topic 分支仅允许快进式抓取。

你也可以在配置文件中指定多个用于 fetch 操作的引用规格。 如果想在每次抓取时都包括 masterexperiment 分支,可以这样写:

[remote "origin"]
	url = https://github.com/schacon/simplegit-progit
	fetch = +refs/heads/master:refs/remotes/origin/master
	fetch = +refs/heads/experiment:refs/remotes/origin/experiment

参考资料

【1】 https://git-scm.com/book/zh/v2/

【2】《Git 高手之路》,人民邮电出版社

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值