3. Git 版本比较
在编写文档时,往往需要对比自己的修改情况,经过比较当前修改或过去的某些修改之间的差异来找出问题存在的原因。这时候你可以使用 git diff 命令达到上述目的。
git diff 命令
作用: 查看工作区和暂存区、工作区和最后一次提交以及过去的两次提交之间的改动情况。它可以比较不同提交、分支、标签之间的差异。
命令格式:
git diff [选项] [提交1] [提交2] [--] [路径]
说明:
- 当提交2省略不写时,使用路径对比暂存区或当前 HEAD 提交对象的内容。
git diff 的常用选项
--staged 或 --cached命令示例:
git diff --staged或git diff --cached是比较当前暂存区和最后提交HEAD之间的差别。git diff是比较当前工作区和暂存区之间的差别,如果暂存区不存起则比较最后提交HEAD之间的差别。git diff 8e7f7c7是比较当前工作区和提交8e7f7c7之间的差别。git diff v0.1 v0.2是比较两个标签之间的差别。git diff 8e7f7c7 9d3b213是比较两个提交之间的差别。git diff HEAD~1 HEAD~2是比较当前提交的前一次提交和前两次提交之间的差别。
示例:
以当前的 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 这次提交合并和 3 和 4 两次提交,并修改 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 行 aaaaaaaa 和 bbbbbbbb。
4、 比较 9d3b213 和 8e7f7c7 之间的差别:git diff 9d3b213 8e7f7c7 或 git 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 比较各个版本的不同。