git HEAD / HEAD^ / HEAD~ 的含义

HEAD

HEAD 指向当前所在分支提交至仓库的最新一次的 commit

# 使用最新一次提交重制暂存区
git reset HEAD -- filename

# 使用最新一次提交重制暂存区和工作区
git reset --hard HEAD

# 将 commit log 回滚一次 暂存区和工作区代码不变
git reset --soft HEAD~1

HEAD~{n}

~ 是用来在当前提交路径上回溯的修饰符
HEAD~{n} 表示当前所在的提交路径上的前 n 个提交(n >= 0):
HEAD = HEAD~0
HEAD~ = HEAD~1
HEAD~~ = HEAD~2
HEAD{n个~} = HEAD~n

HEAD^n

^ 是用来切换父级提交路径的修饰符。当我们始终在一个分支比如 dev 开发/提交代码时,每个 commit 都只会有一个父级提交,就是上一次提交,但当并行多个分支开发,feat1, feat2, feat3,完成后 merge feat1 feat2 feat3dev 分支后,此次的 merge commit 就会有多个父级提交。

image.png
如上提交图所示,当前的 HEAD 节点有 3 个父级:feat1(归并到主线),feat2feat3

tips: 父级 一词本身就代表回溯了 1

HEAD 的 第一个父级

# 第一个父级提交 即 feat1 的最近第1次的提交
λ git show HEAD^
feat1 3 foo_feat1
    
# 第一个父级提交的上1次提交 即 feat1 的最近第2次的提交
λ git show HEAD^~1 / git show HEAD^^
feat1 2 foo_feat1
    
# 第一个父级提交的上2次提交 即 feat1 的最近第3次的提交
λ git show HEAD^~2 / git show HEAD^^^
feat1 1 foo_feat1

HEAD 的 第二个父级

# 第二个父级提交 即 feat2 的最近第1次的提交
λ git show HEAD^2
feat2 2 foo_feat2
    
# 第二个父级提交的上1次提交 即 feat2 的最近第2次的提交
λ git show HEAD^2~1 / git show HEAD^2^
feat2 1 foo_feat2
    
# 第二个父级提交的上2次提交 即 feat2 的最近第3次的提交
λ git show HEAD^2~2 / git show HEAD^2^^
feat2 add foo_feat2

HEAD 的 第三个父级

# 第三个父级提交 即 feat3 的最近第1次的提交
λ git show HEAD^3
feat3 2 foo_feat3
    
# 第三个父级提交的上1次提交 即 feat3 的最近第2次的提交
λ git show HEAD^3~1 / git show HEAD^3^
feat3 1 foo_feat3
    
# 第三个父级提交的上2次提交 feat3 的最近第3次的提交回归到了主线上
λ git show HEAD^3~2 / git show HEAD^3^^
master foo 2

示例

# 当前提交
HEAD = HEAD~0 = HEAD^0

# 主线回溯
HEAD~1 = HEAD^ 主线的上一次提交
HEAD~2 = HEAD^^ 主线的上二次提交
HEAD~3 = HEAD^^^ 主线的上三次提交

# 如果某个节点有其他分支并入
HEAD^1 主线提交(第一个父提交)
HEAD^2 切换到了第2个并入的分支并得到最近一次的提交
HEAD^2~3 切换到了第2个并入的分支并得到最近第 4 次的提交
HEAD^3~2 切换到了第3个并入的分支并得到最近第 3 次的提交

# ^{n} 和 ^ 重复 n 次的区别 
HEAD~1 = HEAD^
HEAD~2 = HEAD^^
HEAD~3 = HEAD^^^
# 切换父级
HEAD^1~3 = HEAD~4 
HEAD^2~3 = HEAD^2^^^
HEAD^3~3 = HEAD^3^^^

规范至上

1.7k 声望
121 粉丝
0 条评论
推荐阅读
linux 用户/组相关操作
查看所有用户/组 {代码...} 添加用户useradd 选项 用户名 {代码...} {代码...} 删除用户 {代码...} 设置/更新用户密码 {代码...} 更改用户属性usermod 选项 用户名 {代码...} 为用户增加sudo权限root 查看 /etc/s...

big_cat阅读 426

Git操作不规范,战友提刀来相见!
年终奖都没了,还要扣我绩效,门都没有,哈哈。这波骚Git操作我也是第一次用,担心闪了腰,所以不仅做了备份,也做了笔记,分享给大家。问题描述小A和我在同时开发一个功能模块,他在优化之前的代码逻辑,我在开...

王中阳Go5阅读 2.3k评论 2

封面图
Git 入门与实践
Git 入门与实践推荐:猴子都能懂的 GIT 入门Git --everything-is-loca 官方文档Git 教程-廖雪峰Git 的使用方式有很多。图形化 —— 小乌龟(Tortoise Git )、命令行—— git bash、IDE 集成等 ......目录1. 基础配置...

RainBow1阅读 2.2k

openKylin 0.9.5版本正式发布,加速国产操作系统自主创新进程!
2023年1月12日,中国桌面操作系统根社区openKylin(开放麒麟)正式发布openKylin 0.9.5操作系统版本。此版本充分适应5G时代需求,打通平板,PC等设备,实现多端融合,弥补了国产操作系统的短板,有效推动国产操作...

openKylin5阅读 7.2k

封面图
SegmentFault 思否技术周刊 Vol.78 — Git 必看技术补给
Git 的诞生是一个非常有趣的故事。1991年 Linus 开源了 Linux 内核,无数 Linux 爱好者在世界各地为 Linux 编写代码,那么问题来了,这些代码该如何管理呢?起初 Linus 使用 BitKeeper(BitMover 公司的版本控制软...

Beverly3阅读 1.5k

封面图
git patch常用方法
针对指定的commit range生成patch,默认对每一个commit分别单独生成patch文件。patch文件按照commit的先后顺序从1开始编号。patch文件会生成到当前目录下。

黑暗森林1阅读 13.2k评论 1

openSSH升级公钥失效Permission denied (publickey)解决方案
背景centos系统升级openSSH后,服务器上无法再拉取代码,报错如下:原因服务器重新安装SSH后公钥改变,需要重新安装ssh-keygen -t rsa -C "邮箱地址"生成公钥,删除gitlab原有公钥,但是git pull依然报错如下:依...

兰俊秋雨1阅读 1.3k

规范至上

1.7k 声望
121 粉丝
宣传栏