3. Git 版本比较

在编写文档时,往往需要对比自己的修改情况,经过比较当前修改或过去的某些修改之间的差异来找出问题存在的原因。这时候你可以使用 git diff 命令达到上述目的。

git diff 命令

作用: 查看工作区和暂存区、工作区和最后一次提交以及过去的两次提交之间的改动情况。它可以比较不同提交、分支、标签之间的差异。

命令格式:

git diff [选项] [提交1] [提交2] [--] [路径]

说明:

  1. 提交2省略不写时,使用路径对比暂存区或当前 HEAD 提交对象的内容。

git diff 的常用选项

选项
说明
--staged--cached
比较暂存区(如果暂存)和 HEAD 之间的差别。

命令示例:

示例:

以当前的 my_project 为例,当前的仓库结构如下:

                                             HEAD
                                              |
                                          .--------.
                                          | master |
                                          `--------`
                                             |
+-------+     +-------+     +-------+     +-------+
|8cb34d1| <-- |5dcccb0| <-- |9d3b213| <-- |11caedf|
+-------+     +-------+     +-------+     +-------+
                  ^                         |
                  |         +-------+  <----+
                  `-------- |8e7f7c7|
                            +-------+
                               |
                            .--------.
                            |  myb1  |
                            `--------`

其中每个提交的节点的内容如下:

1) 8cb34d1 这次提交增加了文件 README.md 2) 5dcccb0 这次提交增加了文件 website.txt 其内容是

https://weimingze.com

3) 8e7f7c7 这次提交增加了文件 function1.txt 并修改 website.txt 的内容为

https://weimingze.com
https://weimingze.com/c/

4) 9d3b213 这次提交增加了文件 function2.txt 并修改 website.txt 的内容为

https://weimingze.com
https://weimingze.com/git/

5) 11caedf 这次提交合并和 34 两次提交,并修改 website.txt 的内容为

https://weimingze.com
https://weimingze.com/c/
https://weimingze.com/git/

现在修改工作区中 website.txt 的内容为

https://weimingze.com
aaaaaaaa
https://weimingze.com/c/
https://weimingze.com/git/

然后通过 git add website.txt 添加到 暂存区,然后再次修改工作区的 website.txt 内容如下:

https://weimingze.com
aaaaaaaa
https://weimingze.com/c/
bbbbbbbb
https://weimingze.com/git/

1、 比较暂存区和 HEAD 之间的差别:git diff --staged

weimingze@mzstudio:~/my_project$ git diff --staged
diff --git a/website.txt b/website.txt
index ee1ef1a..82fe119 100644
--- a/website.txt
+++ b/website.txt
@@ -1,3 +1,4 @@
 https://weimingze.com
+aaaaaaaa^M
 https://weimingze.com/c/
 https://weimingze.com/git/

上述输出内容中、--- a/website.txt 表示原始文件(HEAD中的文件) +++ b/website.txt 表示修改后的文件(暂存区的文件)。@@ -1,3 +1,4 @@ 表示修改的内容。-1,3 表示原始文件的第 1 行开始的 3 行。+1,4 表示修改后的文件(暂存区的文件)的第 1 行开始的 4 行。+aaaaaaaa^M 表示修改后比修改前增加的一行 aaaaaaaa 后面的 ^M 表示这一行以 Windows 的换行 CRLF 结尾。修改内容中第一个字符是 + 表示增加的一行,- 表示修改后删除的行,空格表示不变。

2、 比较工作区和暂存区 之间的差别:git diff

weimingze@mzstudio:~/my_project$ git diff
diff --git a/website.txt b/website.txt
index 82fe119..c896361 100644
--- a/website.txt
+++ b/website.txt
@@ -1,4 +1,5 @@
 https://weimingze.com
 aaaaaaaa
 https://weimingze.com/c/
+bbbbbbbb^M
 https://weimingze.com/git/
weimingze@mzstudio:~/my_project$

可见当前工作区比暂存区多了一行 bbbbbbbb

3、 比较工作区和 HEAD 之间的差别:git diff HEAD

weimingze@mzstudio:~/my_project$ git diff HEAD
diff --git a/website.txt b/website.txt
index ee1ef1a..c896361 100644
--- a/website.txt
+++ b/website.txt
@@ -1,3 +1,5 @@
 https://weimingze.com
+aaaaaaaa^M
 https://weimingze.com/c/
+bbbbbbbb^M
 https://weimingze.com/git/

可见当前工作区比 HEAD 提交 多了 2 行 aaaaaaaabbbbbbbb

4、 比较 9d3b2138e7f7c7 之间的差别:git diff 9d3b213 8e7f7c7git diff HEAD^1 HEAD^2

weimingze@mzstudio:~/my_project$ git diff HEAD^1 HEAD^2
diff --git a/function1.txt b/function1.txt
new file mode 100644
index 0000000..2f3b80f
--- /dev/null
+++ b/function1.txt
@@ -0,0 +1 @@
+新功能1的实现代码^M
diff --git a/function2.txt b/function2.txt
deleted file mode 100644
index 7dc6e91..0000000
--- a/function2.txt
+++ /dev/null
@@ -1 +0,0 @@
-新功能2的实现代码
diff --git a/website.txt b/website.txt
index c69f01b..2ddf62f 100644
--- a/website.txt
+++ b/website.txt
@@ -1,2 +1,2 @@
 https://weimingze.com
-https://weimingze.com/git/
+https://weimingze.com/c/^M

可见合并之前,提交9d3b213 没有文件 function1.txt/dev/null 表示没有此文件), 提交8e7f7c7 没有文件 function2.txt

实验:

使用 git diff 比较各个版本的不同。