引用规格
如果使用了远程仓库,那么远程仓库和本地仓库就会有一个映射关系。这个映射关系定义在.git/config文件中。
比如,在Gitee上建立了一个远程仓库,然后克隆到本地后,确认一下.git/config文件
$ cat .git/config
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[remote "origin"]
url = https://gitee.com/kutilion/FirstRepositoryOnGitee.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[branch "testing"]
remote = origin
merge = refs/heads/testing
其中的[remote “origin”]就是映射关系。又叫做引用规格。
引用规格的格式是一个可选的 + 号和紧随其后的 <src>:<dst> 组成, <src>代表远程版本库中的引用。<dst> 是那些远程引用在本地所对应的位置。 + 表示(强制)更新引用。
引用规格,一般由git remote add命令更新。但是clone远程仓库的时候也会自动生成。Git 获取服务器中 refs/heads/ 下面的所有引用,并将它写入到本地的 refs/remotes/origin/ 中。通过如下命令可以确认远程分支的提交记录
$ git log origin/master
$ git log remotes/origin/master
$ git log refs/remotes/origin/master
这三个命令式相同的。
$ git log origin/master --oneline
f28e022 (HEAD -> master, origin/master, origin/HEAD) 20190411
e46ced8 !2 2nd merge request Merge pull request !2 from kutilion/testing
e80e68d Add java file but new comment
8242b78 (origin/testing, testing) 20190419
08fd076 20190419
e6b34f9 !1 Change sth commit Merge pull request !1 from kutilion/testing
e6e7155 change sth
4ff4301 Initial commit
上面示例中的引用规格的fetch部分将所有的远程分支都取回本地。因为使用了通配符*。可以手动修改成特定分支。比如
fetch = +refs/heads/master:refs/remotes/origin/master
如果你修改了config文件的引用规格,那么不特殊指定的命令都会遵循这个引用规格。
当然可以不修改引用规格,也实现相同功能。那么就需要在命令后添加参数
$ git fetch origin master:refs/remotes/origin/mymaster
这个命令会将远程仓库的master分支拉取到本地的mymaster分支
一次性指定多个分支也使可以的
$ git fetch origin master:refs/remotes/origin/master2 testing:refs/remotes/origin/testing2
From https://gitee.com/kutilion/FirstRepositoryOnGitee
* [new branch] master -> origin/master2
* [new branch] testing -> origin/testing2
拉取到本地时,如果本地不存在这个分支,就会将其建立。
当然,在引用规格中再引入一个fetch行,也可以实现这个操作。 比如
[remote "origin"]
url = https://gitee.com/kutilion/FirstRepositoryOnGitee.git
fetch = +refs/heads/master:refs/remotes/origin/master2
fetch = +refs/heads/testing:refs/remotes/origin/testing2
引用规格推送
如果想将本地的分支推送到远程的不同分支上,可以使用如下命令
$ git push origin master:refs/heads/features/master
Total 0 (delta 0), reused 0 (delta 0)
remote: Powered By Gitee.com
To https://gitee.com/kutilion/FirstRepositoryOnGitee.git
* [new branch] master -> features/master
想每次运行git push origin都想上面一样推送到features/master远程分支可以修改引用规格
[remote "origin"]
url = https://gitee.com/kutilion/FirstRepositoryOnGitee.git
fetch = +refs/heads/master:refs/remotes/origin/master2
fetch = +refs/heads/testing:refs/remotes/origin/testing2
push = refs/heads/master:refs/heads/features/master
不需要远程的分支,也可以将其删除
$ git push origin :refs/heads/features/master
remote: Powered By Gitee.com
To https://gitee.com/kutilion/FirstRepositoryOnGitee.git
- [deleted] features/master
注意,这个时候<src>没有被指定。所以远程服务器的和本地想对应的分支被删除了。这个命令比较古老,推荐使用如下的新命令
$ git push origin --delete features/master
remote: Powered By Gitee.com
To https://gitee.com/kutilion/FirstRepositoryOnGitee.git
- [deleted] features/master