Git命令中HEAD^和HEAD~区别

##说明
本篇文章是对Pro Git 7.1 Git 工具 - 选择修订版本 章节中 祖先引用 的总结。
##git命令中HEAD^和HEAD~区别。

  • HEAD+数字表示当前提交的父提交。具体是第几个父提交共同过+数字指定,EAD^1第一个父提交,该语法只能用于合并(merge)的提交记录,因为一个通过合并产生的commit对象才有多个父提交。
  • HEAD~(等同于HEAD^,注意没有加数字)表当前提交的上一个提交。

使用场景:如果想获取一个提交的第几个父提交使用HEAD+数字,想获取一个提交的上几个提交使用HEAD~。HEAD和HEAD或HEAD^^和HEAD并没有区别,只有HEAD^+数字才和HEAD有区别。

我们现在有个一个master分支,我们通过在master分支执行这两个命令了来了解一下他们之间的区别,当前master分支提交记录如下:

Administrator@USER-20171018VX MINGW64 /d/branch-test (master)
$ git log --oneline --graph
*   ae64286 (HEAD -> master) Merge branch 'iss11'
|\
| * 34af7c6 (iss11) 添加 run()
* | 247c954 添加 testRun()
|/
* 79779c7 添加 main()
*   d44c096 Merge branch 'dev' 将dev分支内容合并到master分支
|\
| * 89a6a5a (dev) 介绍你可以向文件写入什么内容
* | bd61a96 添加介绍说明
|/
* 01833f9 添加文件类型说明
* 5f19dbf 新建文件a.txt和b.txt

##1,HEAD^
###1.1,最新一次提交的第一个父提交。

	Administrator@USER-20171018VX MINGW64 /d/branch-test (master)
	$ git show HEAD^1
	commit 247c954617cdcb457ced546bb7244ce61b3ccc2b
	Author: zhangxy <[email protected]>
	Date:   2018-08-30 10:33:26 +0800

		添加 testRun()

	diff --git a/b.txt b/b.txt
	index 3473edf..5fe14d5 100644
	--- a/b.txt
	+++ b/b.txt
	@@ -1 +1,4 @@
	 my name is b file
	+public void testRun(){
	+
	+}

###1.2,最新一次提交的第二个父提交

	Administrator@USER-20171018VX MINGW64 /d/branch-test (master)
	$ git show HEAD^2
	commit 34af7c6b386f5e09d24340e0f8a1b1f6b5bfd47d (iss11)
	Author: zhangxy <[email protected]>
	Date:   2018-08-30 10:30:19 +0800

		添加 run()

	diff --git a/a.txt b/a.txt
	index d196d14..50e3bfc 100644
	--- a/a.txt
	+++ b/a.txt
	@@ -5,3 +5,8 @@ my name is file a
	 public static void main(String [] args){

	 }
	+
	+public void run(){
	+
	+}

###1.3,最新一次提交的上两个提交。

	Administrator@USER-20171018VX MINGW64 /d/branch-test (master)
	$ git show HEAD^^
	commit 79779c75aeea6a4f514d1c77db5d86431011e117
	Author: zhangxy <[email protected]>
	Date:   2018-08-30 10:26:15 +0800

		添加 main()

	diff --git a/a.txt b/a.txt
	index 759ac2f..d196d14 100644
	--- a/a.txt
	+++ b/a.txt
	@@ -2,3 +2,6 @@ my name is file a
	 我是一个txt类型文件
	 你可以输入汉子并不会出现乱码
	 你可以向这里写入字符
	+public static void main(String [] args){
	+
	+}

##2,HEAD~
###2.1,最新一次提交的上两个提交。

	Administrator@USER-20171018VX MINGW64 /d/branch-test (master)
	$ git show HEAD~2
	commit 79779c75aeea6a4f514d1c77db5d86431011e117
	Author: zhangxy <[email protected]>
	Date:   2018-08-30 10:26:15 +0800

		添加 main()

	diff --git a/a.txt b/a.txt
	index 759ac2f..d196d14 100644
	--- a/a.txt
	+++ b/a.txt
	@@ -2,3 +2,6 @@ my name is file a
	 我是一个txt类型文件
	 你可以输入汉子并不会出现乱码
	 你可以向这里写入字符
	+public static void main(String [] args){
	+
	+}

##3,HEAD^和HEAD~结合使用
###3.1,想获取89a6a5a提交对象。

	Administrator@USER-20171018VX MINGW64 /d/branch-test (master)
	$ git show HEAD~3^2
	commit 89a6a5a6f544ff74cc49341aab1484b084be7759 (dev)
	Author: zhangxy <[email protected]>
	Date:   2018-08-29 21:23:50 +0800

		介绍你可以向文件写入什么内容

	diff --git a/a.txt b/a.txt
	index e5f555c..0cde68b 100644
	--- a/a.txt
	+++ b/a.txt
	@@ -1,2 +1,3 @@
	 my name is file a
	 我是一个txt类型文件
	+你可以向这里写入字符

你可能感兴趣的:(Git)