-
附录 A:Git 在其他环境中的使用 图形界面
- A1.1 图形界面
- A1.2 Git 在 Visual Studio 中的使用
- A1.3 Git 在 Visual Studio Code 中的使用
- A1.4 Git 在 IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine 中的使用
- A1.5 Git 在 Sublime Text 中的使用
- A1.6 Git 在 Bash 中的使用
- A1.7 Git 在 Zsh 中的使用
- A1.8 Git 在 PowerShell 中的使用
- A1.9 总结
-
附录 B:将 Git 嵌入到应用程序中 命令行 Git
-
附录 C:Git 命令 设置和配置
10.5 Git 内部 - Refspec(引用规范)
Refspec(引用规范)
在本书中,我们使用了从远程分支到本地引用的简单映射,但它们可以更加复杂。假设你按照前几节的内容操作,创建了一个小的本地 Git 仓库,现在想添加一个远程仓库。
$ git remote add origin https://github.com/schacon/simplegit-progit
运行上面的命令会在你的仓库的 .git/config
文件中添加一个部分,指定远程仓库的名称(origin
)、远程仓库的 URL 以及用于获取的refspec。
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/*:refs/remotes/origin/*
refspec 的格式是,首先是一个可选的 +
,然后是 <src>:<dst>
,其中 <src>
是远程端引用的模式,<dst>
是这些引用将在本地跟踪到的位置。+
告诉 Git 更新引用,即使它不是快进。
在 git remote add origin
命令自动写入的默认情况下,Git 获取服务器上 refs/heads/
下的所有引用,并将它们写入本地的 refs/remotes/origin/
。因此,如果服务器上有一个 master
分支,你可以通过以下任何方式访问该分支的日志:
$ git log origin/master
$ git log remotes/origin/master
$ git log refs/remotes/origin/master
它们都是等价的,因为 Git 将它们中的每一个都扩展为 refs/remotes/origin/master
。
如果你希望 Git 在每次获取时只拉取 master
分支,而不是远程服务器上的每个其他分支,你可以将 fetch 行更改为仅引用该分支:
fetch = +refs/heads/master:refs/remotes/origin/master
这只是该远程仓库 git fetch
的默认 refspec。如果你想执行一次性获取,你也可以在命令行上指定特定的 refspec。要将远程仓库上的 master
分支拉取到本地的 origin/mymaster
,可以运行:
$ git fetch origin master:refs/remotes/origin/mymaster
你还可以指定多个 refspec。在命令行上,你可以这样拉取多个分支:
$ git fetch origin master:refs/remotes/origin/mymaster \
topic:refs/remotes/origin/topic
From [email protected]:schacon/simplegit
! [rejected] master -> origin/mymaster (non fast forward)
* [new branch] topic -> origin/topic
在这种情况下,master
分支拉取被拒绝,因为它未被列为快进引用。你可以通过在 refspec 前面指定 +
来覆盖此行为。
你也可以在配置文件中为获取指定多个 refspec。如果你希望始终从 origin
远程仓库获取 master
和 experiment
分支,可以添加两行:
[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
从 Git 2.6.0 开始,你可以在模式中使用部分通配符来匹配多个分支,因此这可以工作:
fetch = +refs/heads/qa*:refs/remotes/origin/qa*
更好的是,你可以使用命名空间(或目录)来实现相同的功能,并具有更多的结构。如果你有一个 QA 团队推送一系列分支,并且你希望获取 master
分支和任何 QA 团队的分支,但没有其他分支,你可以使用这样的配置部分:
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/master:refs/remotes/origin/master
fetch = +refs/heads/qa/*:refs/remotes/origin/qa/*
如果您有一个复杂的流程,其中 QA 团队、开发团队以及集成团队都在推送和协作处理远程分支,您可以通过这种方式轻松地为它们命名空间。
推送 Refspecs
能够以这种方式获取命名空间引用很好,但是 QA 团队如何才能首先将他们的分支放入 qa/
命名空间呢?您可以使用 refspecs 来推送以实现此目的。
如果 QA 团队希望将其 master
分支推送到远程服务器上的 qa/master
,他们可以运行以下命令:
$ git push origin master:refs/heads/qa/master
如果他们希望 Git 在每次运行 git push origin
时自动执行此操作,他们可以在其配置文件中添加一个 push
值
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/*:refs/remotes/origin/*
push = refs/heads/master:refs/heads/qa/master
同样,这将导致 git push origin
默认将本地 master
分支推送到远程 qa/master
分支。
注意
|
您不能使用 refspec 从一个仓库获取并推送到另一个仓库。有关如何执行此操作的示例,请参阅 保持您的 GitHub 公共仓库最新。 |
删除引用
您还可以使用 refspec 从远程服务器删除引用,方法是运行以下类似命令:
$ git push origin :topic
因为 refspec 是 <src>:<dst>
,所以通过省略 <src>
部分,这基本上表示将远程上的 topic
分支设为空,从而将其删除。
或者您可以使用较新的语法(从 Git v1.7.0 开始可用)
$ git push origin --delete topic