Git学习之比较差异

比较差异是我们在使用git的过程中经常会遇到的场景,我们边做边聊,为了方便演示,重新创建一个git仓库,并且创建两个测试文件,命令如下:

$ git init test_repo
$ cd test_repo
$ echo 1 >> test1
$ echo 2 >> test1
$ echo 3 >> test1
$ echo a >> test2
$ echo b >> test2
$ echo c >> test2
$ git add test1 test2
$ git commit -m "init test file"

我创建了两个测试文件,test1和test2,然后将这两个文件添加到了暂存区,最后创建了一个提交,也就是说,最新的提交中保存了test1文件和test2文件的当前的状态。
目前test1和test2的文件内容如下:

$ cat test1
1
2
3
 
$ cat test2
a
b
c

现在,我想要修改一下这两个文件,我想把test1文件的第2行删除,然后再添加一行,我想把test2文件的最后一行的’c’改成’cc’,修改后的结果如下:

$ cat test1
1
3
new
 
$ cat test2
a
b
cc

上述操作完成后,我们并没有使用git add命令将修改添加到暂存区,更没有创建提交,所以说,当前工作区的test1文件和test2文件的内容与暂存区和提交中的内容是不同的,那么我们怎样对比这种不同呢?很简单,我们只要使用git diff命令就能够进行差异比较了,比如,我想比较一下,当前的工作目录和暂存区中都有哪些差异呢?则可以直接使用git diff命令进行对比,示例如下:

$ git diff
diff --git a/test1 b/test1
index 01e79c3..397b006 100644
--- a/test1
+++ b/test1
@@ -1,3 +1,3 @@
1
-2
3
+new
diff --git a/test2 b/test2
index de98044..278314e 100644
--- a/test2
+++ b/test2
@@ -1,3 +1,3 @@
a
b
-c
+cc

返回信息如上,可以看到,test1文件中的第二行被删除了,因为"2"前面有一个减号,并且,添加了新的一行,新行的内容为"new",因为"new"前面有一个加号,test2文件中的差异也被显示了出来,我们把test2文件中的第三行的’c’改成了’cc’,对于git来说,git认为我们把’c’这一行删除了,然后又在原位置添加了新的一行’cc’,可以看出,当我们使用git diff命令时,git会将工作区与暂存区中的所有文件差异一次性的全部显示出来,如果我们只想查看某个特定文件在这两个区域的差异,也可以指定要查看的文件,比如,我们只想看看test1文件在工作区和暂存区是否存在差异,只需要执行如下命令即可:

$ git diff -- test1
diff --git a/test1 b/test1
index 01e79c3..397b006 100644
--- a/test1
+++ b/test1
@@ -1,3 +1,3 @@
1
-2
3
+new

上例中的’–'后面可以跟随多个文件路径,每个文件路径用空格隔开,上述命令中我们只指定了test1文件的文件路径。

由于我们修改文件以后并没有暂存这些修改,更没有创建提交,所以,目前来说,暂存区和提交中的文件内容是相同的,也就是说,“暂存区和提交中指向的文件” 与 “工作区中的文件” 之间的差异是相同的,那么,怎样查看工作区和提交中的文件差异呢?如果想要查看工作区和最新提交之间的差异,则可以使用如下命令查看:

$ git diff HEAD
diff --git a/test1 b/test1
index 01e79c3..397b006 100644
--- a/test1
+++ b/test1
@@ -1,3 +1,3 @@
1
-2
3
+new
diff --git a/test2 b/test2
index de98044..278314e 100644
--- a/test2
+++ b/test2
@@ -1,3 +1,3 @@
a
b
-c
+cc

没错,使用"git diff HEAD"命令即可查看工作区与当前分支最新的提交之间的差异,还记得上一篇文章中我们总结的HEAD指针么?前一篇文章中我们总结过,通常情况下,HEAD指针总是间接的指向了当前所在分支的最新提交,所以,你可以把"git diff HEAD"命令中的HEAD理解成当前所在分支的最新提交的别名.
在这里插入图片描述
刚才我们只是进行了修改操作,没有进行任何暂存和提交,现在,我们来将刚才的修改添加到暂存区,执行如下命令:

$ git add -A

从目前状态来看,工作区中的文件状态已经和暂存区的文件状态相同了,因为我已经把所有变更都暂存了,所以,此时再次使用"git diff"命令查看工作区和暂存区的文件差异,则不会显示任何内容,因为此时这两个区域没有差异,但是如果我执行"git diff HEAD"命令,仍然可以查看到工作区和提交之间的差异。

我们来试试,我们尝试着在test2文件中添加一行,命令如下:

$ cat test2
a
b
cc
 
$ echo dd >> test2
 
$ cat test2
a
b
cc
dd

查看工作区和暂存区的差异

$ git diff
diff --git a/test2 b/test2
index 278314e..e165bb5 100644
--- a/test2
+++ b/test2
@@ -1,3 +1,4 @@
a
b
cc
+dd

查看工作区和最新提交的差异

$ git diff HEAD
diff --git a/test1 b/test1
index 01e79c3..397b006 100644
--- a/test1
+++ b/test1
@@ -1,3 +1,3 @@
1
-2
3
+new
diff --git a/test2 b/test2
index de98044..e165bb5 100644
--- a/test2
+++ b/test2
@@ -1,3 +1,4 @@
a
b
-c
+cc
+dd

没错,我们通过 “git diff” 和 “git diff HEAD” 命令已经可以清楚的查看到了工作区和另外两个逻辑区域的差异了,你可能会问,如果在这个时候,我想要查看暂存区和最新提交之间的差异,该怎样查看呢?很简单,使用"git diff --cached"命令即可查看,示例如下:

$ git diff --cached
diff --git a/test1 b/test1
index 01e79c3..397b006 100644
--- a/test1
+++ b/test1
@@ -1,3 +1,3 @@
1
-2
3
+new
diff --git a/test2 b/test2
index de98044..278314e 100644
--- a/test2
+++ b/test2
@@ -1,3 +1,3 @@
a
b
-c
+cc

由于最新的修改(在test2中添加"dd"文本的操作)还没有暂存到暂存区,所以,当我们查看暂存区和最新提交之间的差异时,是看不到最新添加的"dd"的,因为在此时,暂存区和提交中都没有"dd"这一行,目前来说,"dd"这一行只存在于工作区的test2文件中。
在这里插入图片描述
我先将最新的修改暂存,然后一次性的将所有修改全部提交,命令如下:

$ git add test2

将所有修改一次性提交

$ git commit -m "test"

到目前为止,我们的仓库中已经保存了两个状态,也就是说,当前的git仓库中一共有两个提交,我们能不能对比一下这两个提交之间的差异呢?当然能了,同样使用git diff命令就能完成,首先,我们来查看一下当前的提交历史,如下:

$ git log --oneline
aafbaa8 (HEAD -> master) test
a63d5b2 init test file

如你所见,我们已经创建了两个提交,第一个提交是’a63d5b2’,第二个提交是’aafbaa8’,如果我想要对比这两个提交之间的差异,则可以使用如下命令:

$ git diff a63d5b2 aafbaa8
diff --git a/test1 b/test1
index 01e79c3..397b006 100644
--- a/test1
+++ b/test1
@@ -1,3 +1,3 @@
1
-2
3
+new
diff --git a/test2 b/test2
index de98044..e165bb5 100644
--- a/test2
+++ b/test2
@@ -1,3 +1,4 @@
a
b
-c
+cc
+dd

上文中说过,可以使用"HEAD"代指最新的提交,所以,上述命令可以改成如下命令,它们的效果是一样的。

$ git diff a63d5b2 HEAD

其实,我们还有更简便的方法,比如,我们可以把上述命令改成如下命令:

$ git diff HEAD~ HEAD

上述简易的写法被称作"相对提交名",我们可以使用相对提交名来快速的定位(或者代指)最新的几个提交,这样做的方便之处就在于我们不用通过"git log"命令查看最近的几个提交的哈希值,就可以直接通过相对提交名快速的操作最新的几个提交了,还是很方便的。

注:你可能还看到过类似"HEAD^"写法的相对提交名,这样的相对提交名在提交有多个直系父提交时比较常用。

其实,我们还可以反过来操作,利用相对提交名获取到对应提交的哈希码,只要借助"git rev-parse"命令即可。
比如,获取到最新的第二个提交的哈希码

$ git rev-parse HEAD~
a63d5b2f38dffb0c0e749a4c49a924490e23a190

你还记得"git rev-parse"命令吗,我们在前文中用过这个命令,此命令可以通过哈希码的缩写获取到完整的哈希码,比如如下命令:

$ git rev-parse a63d5b
a63d5b2f38dffb0c0e749a4c49a924490e23a190

git rev-parse命令不仅能通过相对提交名和哈希码缩写获取到完整的哈希码,还可以通过分支名或者标签名获取到对应提交的哈希码,比如获取master分支上最新提交的哈希码

$ git rev-parse master
aafbaa85ae9f11a5875ba0b66daa76e9afb13c35

到目前为止,我们都是在新创建的测试仓库的master分支上做测试的,现在我们来创建一个新分支,看看在多分支下进行差异对比会不会有什么新发现。

首选,创建一个新的test分支,命令如下:

$ git checkout -b test
Switched to a new branch 'test'

通过上述命令,我们基于master分支创建了新的test分支,并且切换到了test分支上。

现在,我们分别在test分支和master分支上做一些修改,并且创建提交,然后再使用"git diff"命令进行一些比较差异的测试。

首先,在test分支上做一些变更,并且创建提交,操作如下:

/d/workspace/git/test_repo (test)
$ ls
test1  test2
 
/d/workspace/git/test_repo (test)
$ echo "test branch has been created" > test3
 
/d/workspace/git/test_repo (test)
$ git add test3
 
/d/workspace/git/test_repo (test)
$ git commit -m "add new file test3 in test branch"
[test b5543f1] add new file test3 in test branch
1 file changed, 1 insertion(+)
create mode 100644 test3

然后,我们切换到master分支,做一些变更,并且创建提交,操作如下:

/d/workspace/git/test_repo (test)
$ git checkout master
Switched to branch 'master'
 
/d/workspace/git/test_repo (master)
$ ls
test1  test2
 
/d/workspace/git/test_repo (master)
$ cat test1
1
3
new
 
/d/workspace/git/test_repo (master)
$ echo 'New changes in the master branch' >> test1
 
/d/workspace/git/test_repo (master)
$ cat test1
1
3
new
New changes in the master branch
 
/d/workspace/git/test_repo (master)
$ git add test1
 
/d/workspace/git/test_repo (master)
$ git commit -m "New changes in the master branch"
[master ba4b75f] New changes in the master branch
1 file changed, 1 insertion(+)

现在我们已经有了两个分支,master分支和test分支,并且两个分支上都有了属于各自分支的提交,那么此时,我们来尝试使用"git diff"命令来尝试对比一下这两个分支吧,命令如下:

/d/workspace/git/test_repo (master)
$ git diff test master
diff --git a/test1 b/test1
index 397b006..7e5632c 100644
--- a/test1
+++ b/test1
@@ -1,3 +1,4 @@
1
3
new
+New changes in the master branch
diff --git a/test3 b/test3
deleted file mode 100644
index 2116a15..0000000
--- a/test3
+++ /dev/null
@@ -1 +0,0 @@
-test branch has been created

上例中,我们尝试使用"git diff test master"命令对比"两个分支"的差异,其实,"git diff test master"命令并没有对比这两个分支的差异,而是对比了这两个分支上最新提交之间的差异,也就是说,上述命令的作用仍然是两个提交的对比。

摘自 http://www.zsythink.net/archives/3424

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值