What's the difference between HEAD^ and HEAD~ in Git?
https://stackoverflow.com/questions/2221658/whats-the-difference-between-head-and-head-in-git
Rules of thumb
- Use
~most of the time — to go back a number of generations, usually what you want - Use
^on merge commits — because they have two or more (immediate) parents
Mnemonics:
- Tilde
~is almost linear in appearance and wants to go backward in a straight line - Caret
^suggests an interesting segment of a tree or a fork in the road
Tilde
The “Specifying Revisions” section of the git rev-parse documentation defines ~ as
<rev>~<n>, e.g.master~3
A suffix~<n>to a revision parameter means the commit object that is the nth generation ancestor of the named commit object, following only the first parents. [For example,]<rev>~3is equivalent to<rev>^^^which is equivalent to<rev>^1^1^1…
You can get to parents of any commit, not just HEAD. You can also move back through generations: for example, master~2 means the grandparent of the tip of the master branch, favoring the first parent on merge commits.
Caret
Git history is nonlinear: a directed acyclic graph (DAG) or tree. For a commit with only one parent, rev~ and rev^
mean the same thing. The caret selector becomes useful with merge
commits because each one is the child of two or more parents — and
strains language borrowed from biology.
HEAD^ means the first immediate parent of the tip of the current branch. HEAD^ is short for HEAD^1, and you can also address HEAD^2 and so on as appropriate. The same section of the git rev-parse documentation defines it as
<rev>^, e.g.HEAD^,v1.5.1^0
A suffix^to a revision parameter means the first parent of that commit object.^<n>means the nth parent ([e.g.]<rev>^is equivalent to<rev>^1). As a special rule,<rev>^0means the commit itself and is used when<rev>is the object name of a tag object that refers to a commit object.
http://www.paulboxley.com/blog/2011/06/git-caret-and-tilde
I spent a little bit of time playing with Git today, specifically the way that the ^ (caret) and ~ (tilde) work and thought I'd document it here in case I forget.
The short version
If you want a deeper explanation skip down to "The long version".
ref~ is shorthand for ref~1 and means the commit's first parent. ref~2 means the commit's first parent's first parent. ref~3 means the commit's first parent's first parent's first parent. And so on.
ref^ is shorthand for ref^1 and means the commit's first parent. But where the two differ is that ref^2 means the commit's second parent (remember, commits can have two parents when they are a merge).
The ^ and ~ operators can be combined.
Here's a diagram showing how to reference various commits using HEAD as the starting point.
HEAD~1^2 commit的 first parent的second parent

The long version
I've created a dummy repository with several commits in it.
$ git log --graph --oneline
* 8329384 Seventh commit
* f5717b0 Merge branch 'my_branch'
|\
| * 956c87d Fourth commit on a branch
* | a8fe411 Sixth commit
|/
* c7c2590 Third commit on a branch
* 86362ff Second commit on a branch
* 748855b First commit on a branch
* 1855b25 Fifth commit
* 67cf3a7 Fourth commit
* ea29778 Third commit
* 28c25b1 Second commit
* cd00b76 First commit
Starting at the bottom, the early commits were made straight onto master.
The commits starting at 748855b and moving up to c7c2590 were made on a branch and merged into master, but no changes had been made on master in the mean time.
The commits a8fe411 and 956c87d were made on separate branches at the same time. They were merged together in commit f5717b0.
Finally, 8329384 was committed straight onto master.
We can use git show to look at individual commits.
You'll already know that HEAD points to the tip of the current branch:
$ git show --oneline HEAD
8329384 Seventh commit
Putting the caret symbol (^) next to a commit means the parent of that commit. So the following will show the parent of HEAD:
$ git show --oneline HEAD^
f5717b0 Merge branch 'my_branch'
...
HEAD^ is shorthand for saying HEAD^1, which literally means show me parent 1 of that commit. You can also say HEAD^2 but in this instance it won't make any sense:
$ git show --oneline HEAD^2
fatal: ambiguous argument 'HEAD^2': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions
Because HEAD only has 1 parent.
But f5717b0, the point where the two branches were merged, has two parents, one on master and one on the branch:
$ git show --oneline f5717b0^1
a8fe411 Sixth commit
...
$ git show --oneline f5717b0^2
956c87d Fourth commit on a branch
...
The tilde symbol (~) works in a similar way. In fact HEAD~ will reference the same commit as HEAD^:
Again, HEAD~ is shorthand for HEAD~1, but here this means the first ancestor of HEAD – HEAD~2 is not the second parent of HEAD but the grandparent of HEAD:
$ git show --oneline HEAD~1
f5717b0 Merge branch 'my_branch'
...
$ git show --oneline HEAD~2
a8fe411 Sixth commit
...
$ git show --oneline HEAD~3
c7c2590 Third commit on a branch
As you can see, 956c87d Fourth commit on a branch is not visible when using the tilde operator. This is because the tilde operator always presumes you want to view the first parent's parent.
To access the second parent's parent the tilde and caret symbols can be combined:
$ git show --oneline HEAD~1^1
a8fe411 Sixth commit
...
$ git show --oneline HEAD~1^2
956c87d Fourth commit on a branch
...
In this way you should be able to reference any commit in your repository's history.
What's the difference between HEAD^ and HEAD~ in Git?的更多相关文章
- 学习笔记之Git / Gitflow / TortoiseGit
Git - Wikipedia https://en.wikipedia.org/wiki/Git Git (/ɡɪt/) is a version control system for tracki ...
- Git命令中波浪号~与脱字符^的区别
0.前言 波浪号~,英文名叫 tilde.脱字符^,英文名叫caret. 这两种符号常见于git reset的情景,简单的项目结构和操作一般不会涉及到两者之间的区别,似乎用哪个都可以.如果遇到比较繁杂 ...
- Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)
--reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...
- What's the difference between a stub and mock?
I believe the biggest distinction is that a stub you have already written with predetermined behavio ...
- [转载]Difference between <context:annotation-config> vs <context:component-scan>
在国外看到详细的说明一篇,非常浅显透彻.转给国内的筒子们:-) 原文标题: Spring中的<context:annotation-config>与<context:componen ...
- What's the difference between <b> and <strong>, <i> and <em> in HTML/XHTML? When should you use each?
ref:http://stackoverflow.com/questions/271743/whats-the-difference-between-b-and-strong-i-and-em The ...
- difference between forward and sendredirect
Difference between SendRedirect and forward is one of classical interview questions asked during jav ...
- Add Digits, Maximum Depth of BinaryTree, Search for a Range, Single Number,Find the Difference
最近做的题记录下. 258. Add Digits Given a non-negative integer num, repeatedly add all its digits until the ...
- MySQL: @variable vs. variable. Whats the difference?
MySQL: @variable vs. variable. Whats the difference? up vote351down votefavorite 121 In another qu ...
随机推荐
- day 03 int bool str (索引,切片) for 循环
基础数类型总览 10203 123 3340 int +- * / 等等 '今天吃了没?' str 存储少量的数据,+ *int 切片, 其他操作方法 True False bool 判断真假 [12 ...
- C#/.NET/.NET Core定时任务调度的方法或者组件有哪些--Timer,FluentScheduler还是...
原文:C#/.NET/.NET Core定时任务调度的方法或者组件有哪些--Timer,FluentScheduler还是... 原文由Rector首发于 码友网 之 <C#/.NET/.NET ...
- 银联支付SDK集成
下载地址 https://open.unionpay.com/upload/download/Development_kit85427986.rar其实我找了半个小时 也不知道怎么就下载好了 这个我在 ...
- VUE点击颜色选中
- Uva 10054 欧拉回路 打印路径
看是否有欧拉回路 有的话打印路径 欧拉回路存在的条件: 如果是有向图的话 1.底图必须是连通图 2.最多有两个点的入度不等于出度 且一个点的入度=出度+1 一个点的入度=出度-1 如果是无向图的话 1 ...
- Mysql中event事件的入门
Mysql中event事件的入门 主要涉及的知识点:mysql的存储过程.mysql的event事件调度. 参考资料: Qiao_Zhi的博客:[周期性执行事件]MySQL事件(Event)& ...
- threading.local作用及原理
先看下应用: import threading from threading import local import time obj = local() def task(i): obj.xxxxx ...
- SSM框架中IoC、DI与AOP的理解
框架封装了普通项目中程序员需要重复书写的代码和调用过程,就比如说在传统的jsp项目中,我们的controller接收到前端的请求然后程序员就需要去开发Dao层,里面还涉及数据库的连接和存储过程的代码, ...
- 动态列表+动态样式(vue双向绑定)
先上效果图 注:下面的几个值可以从其他地方获取,这边演示我是写死的 在上逻辑图 接着上代码template部分 <template> <div > <div> &l ...
- requests 模块例题示范
requests 模块 re模块和requests模块结合示范实例 .*? 不加圆括号表示在要匹配里面的内容不要: (.*?)表示在要匹配的两者之间的内容都要: import requests imp ...