Git Ref & Refspec - tenji/ks GitHub Wiki

Git Ref & Refspec

一、Git Ref (Git Reference)

  1. 本地分支的 Refs 格式:refs/heads/<local_branch_name>

    refs/heads/master,在保证唯一的情况下可以简写为master

  2. 远程追踪分支的 Refs 格式:refs/remotes/<remote_repository>/<remote_branch_name>

    refs/remotes/origin/master,在保证唯一的情况下可以简写为origin/master

  3. Tag 的 Refs 格式:refs/tags/<tag_name>

    refs/tags/v1.0.1,在保证唯一的情况下可以简写为v1.0.1

二、Git Refspec (Git Reference Specification)

在执行pushfetch操作时,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 [email protected]:schacon/simplegit-progit.git

它会在你的.git/config文件中添加了一节,指定了远程的名称 (origin), 远程仓库的URL地址,和用于获取操作的 Refspec:

[remote "origin"]
       url = [email protected]: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

四、Git 保留的特殊 Refspec

  • HEAD:指向当前本地分支的当前 commit 状态。
  • FETCH_HEAD:指向当前本地分支在最近一次fetch操作时得到的 commit 状态。
  • ORIG_HEAD:指向任何 merge 或 rebase 之前的刚刚检出时的 commit 状态。

参考链接

⚠️ **GitHub.com Fallback** ⚠️