Git学习笔记 004 Git内部原理 part4 Git的引用规格-part文件

Git学习笔记 004 Git内部原理 part4 Git的引用规格-part文件

引用规格

如果使用了远程仓库,那么远程仓库和本地仓库就会有一个映射关系。这个映射关系定义在.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

推荐阅读