git中的HEAD
背景
偶然见到一个 git push origin HEAD
的命令,
心想这样的HEAD语义实在不明确,到底是什么含义,还是需要搞清楚.
HEAD在本地的含义
各个分支和HEAD的本质都是指针.
分支只是指在commit上.tag也是同样.
HEAD可以指在分支上,也可以指在具体的commit上.
而HEAD的当前指向,可以用两个方法得到
cat .git/HEAD
git symbolic-ref HEAD
HEAD的用途
HEAD可以代替复杂难记的commit hash.
HEAD~
~
符号可以用于代表当前分支上的历史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 |
能够将本地代码推送到云端的同名分支上
- 防止写错分支名
- 利用该特性能更好实现自动化
备注:
如果处于 分离头指针的状态, 该方法无法在云端建立同名的 <hash>abcdef
分支,因该hash本身就不是分支名