git中的HEAD

背景

偶然见到一个 git push origin HEAD 的命令,
心想这样的HEAD语义实在不明确,到底是什么含义,还是需要搞清楚.

HEAD在本地的含义

各个分支和HEAD的本质都是指针.
分支只是指在commit上.tag也是同样.
HEAD可以指在分支上,也可以指在具体的commit上.

而HEAD的当前指向,可以用两个方法得到

  1. cat .git/HEAD
  2. git symbolic-ref HEAD

HEAD的用途

HEAD可以代替复杂难记的commit hash.

~ 符号可以用于代表当前分支上的历史commit.

符号 含义
HEAD 当前所在commit
HEAD~0 等同与HEAD
HEAD~1 当前分支上的前一个commit
HEAD~ 等同与HEAD~1
HEAD~~ 当前分支上的前前commit
HEAD~2 HEAD~~的简写

HEAD^

^ 符号可以用于代表有多个父分支时的每个父分支的情况
如果只有一个分支,那么 HEAD^^^HEAD~~~ 是等效的
注意数字不再是多个连续符号的简写

符号 含义
HEAD^0^ 等同于HEAD,自己
HEAD^1^ 直系分支上的父亲
HEAD^ 等同与HEAD^1^
HEAD^2^ 二叔
HEAD^3^ 三叔
HEAD^^0^ 父亲本人,很少用且建议不要拿来唬人,HEAD^1也能代表^
HEAD^^1^ 爷爷
HEAD^11^ 爸爸的爸爸,也叫爷爷
HEAD^^2^ 二爷

合用

HEAD^2~1 二叔家的上一代
HEAD~1^2 爸爸的二叔

举例

HEAD在云端的用途

云端并不报错 .git 文件夹,因此应该也没有地方记录HEAD指向什么地方,
此时HEAD事实上使用本地的值.
而HEAD又通常指向当前的分支(如果不故意checkout到一个旧的commit的话)
因此

1
git push -u origin HEAD

能够将本地代码推送到云端的同名分支上

  1. 防止写错分支名
  2. 利用该特性能更好实现自动化

备注:
如果处于 分离头指针的状态, 该方法无法在云端建立同名的 <hash>abcdef 分支,因该hash本身就不是分支名

参考

  1. HEAD的一些说明