Git Ref & Refspec
-
本地分支的 Refs 格式:
refs/heads/<local_branch_name>
如
refs/heads/master
,在保证唯一的情况下可以简写为master
-
远程追踪分支的 Refs 格式:
refs/remotes/<remote_repository>/<remote_branch_name>
如
refs/remotes/origin/master
,在保证唯一的情况下可以简写为origin/master
-
Tag 的 Refs 格式:
refs/tags/<tag_name>
如
refs/tags/v1.0.1
,在保证唯一的情况下可以简写为v1.0.1
在执行push
或fetch
操作时,Refspec
用以给出本地Ref
和远程Ref
之间的映射关系,通常是本地分支或本地tag
与远程库中的分支或tag
之间的映射关系。
Refspec
格式:
+<src_ref>:<dst_refs>
其中的+
是可选的,表示强制更新
典型的push refspec为HEAD:refs/heads/master
典型的fetch refspec为refs/heads/*:refs/remotes/origin/*
假设你像这样添加了一项远程仓库:
git remote add origin git@github.com:schacon/simplegit-progit.git
它会在你的.git/config
文件中添加了一节,指定了远程的名称 (origin
), 远程仓库的URL地址,和用于获取操作的 Refspec:
[remote "origin"]
url = git@github.com:schacon/simplegit-progit.git
fetch = +refs/heads/*:refs/remotes/origin/*
git log origin/master
git log remotes/origin/master
git log refs/remotes/origin/master
它们全是等价的,因为 Git 把它们都扩展成refs/remotes/origin/master
.
git push origin master:master
在 local repository 中找到名字为 master 的 branch,使用它去更新 remote repository 下名字为 master 的 branch,如果 remote repository 下不存在名字是 master 的branch,那么新建一个,跟下面的命令是一样的:
git push origin master
在 local repository 中找到名字为 master 的 branch,用他去更新 remote repository 下面名字为 mybranch 的 branch:
git push origin master:refs/for/mybranch
HEAD 指向当前工作的 branch,master 不一定指向当前工作的 branch,所以我觉得用 HEAD 还比 master 好些:
git push origin HEAD:refs/for/mybranch
- HEAD:指向当前本地分支的当前 commit 状态。
- FETCH_HEAD:指向当前本地分支在最近一次fetch操作时得到的 commit 状态。
- ORIG_HEAD:指向任何 merge 或 rebase 之前的刚刚检出时的 commit 状态。