git diff用于比较两个文件或者同一文件不同版本的差异,通常在git addgit commit之前,用于确认提交的改动。

基本使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 查看尚未暂存的文件更新了哪些部分
git diff

# 查看尚未暂存的某个文件更新了哪些内容
git diff filename

# 查看已经暂存起来的文件和上次提交的版本之间的差异
git diff –cached

# 查看已经暂存起来的某个文件和上次提交的版本之间的差异
git diff –cached filename

# 查看某两个版本之间的差异
git diff ffd98 b8e7b

# 查看某两个版本的某个文件之间的差异
git diff ffd98:filename b8e7b:filename

# “dev” 分支的哪些改动并不存在于 “master” 上:
git diff master..dev

# 仅仅比较统计信息
git diff --stat

显示内容详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
$ git diff 5a255 21112
diff --git a/BACKERS.md b/BACKERS.md
index 38c410d6..5479839a 100644
--- a/BACKERS.md
+++ b/BACKERS.md
@@ -174,11 +174,6 @@ Funds donated via Patreon go directly to support Evan You's full-time work on Vu
<img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/tidelift.png">
</a>
</td>
- <td align="center" valign="middle">
- <a href="https://webdock.io/en" target="_blank">
- <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/webdock.png">
- </a>
- </td>
</tr><tr></tr>
</tbody>
</table>
@@ -316,7 +311,10 @@ Funds donated via Patreon go directly to support Evan You's full-time work on Vu
- Jake Ingman
- Barbara Liau
- 4
+- The Graphic Design School
+- Christian Griffith
- Jarek Tkaczyk
+- Andrew Davis
- Sean MacIsaac
- Xiaojie LI
- David Hess
@@ -324,13 +322,13 @@ Funds donated via Patreon go directly to support Evan You's full-time work on Vu
- Dariusz Jastrzębski
- Ivan Sieder
- Matt Jones
+- Dave Chenell
- Duncan J Kenzie
- Mike Margerum
- Guy Gavergun
- Edithvale
- Intevation GmbH
- Luiz Eduardo Tanure Bacelar
-- Chengzhi Yin
- Zoran Knezevic
- James Simpson
- Pascal Germain

上述为使用diff命令后的一个输出示例

  • 第2行列出比较的文本a/b;
  • 第3行为元数据,最开始的两串数字表示两个文件的hashes(简单点说就是它们的 “ID”)。不仅仅是整个项目,Git还会把每一个文件当作对象来保存。这个 hash ID 就代表了一个文件对象的特定版本。最后的一串数字代表了一个文件的模式(100644 代表它是一个普通的文件,100755表示一个可执行文件,120000仅仅是一符号链接)。;
  • 第4、5行为比较文件a/b的标识;
  • 第6行开始到结束是文件不同的区块;
  • 第6行为第一个区块的的区块头;
  • 第7行到17行为第一个区块,其中在每行开头标有“+”或“-”标识该行内容为对应文件特有的;
  • 第18行到第28行为第二个区块,其中18行为第二个区块的区块头; 第29行到结尾是滴三个区块

补丁(patch)

当我们希望将我们本仓库工作区的修改拷贝一份到其他机器上使用,但是修改的文件比较多,拷贝量比较大,此时我们可以将修改的代码做成补丁,之后在其他机器上对应目录下将补丁打上即可。

生成补丁文件

补丁文件实际上就是diff显示的信息,执行相应的diff命令,将结果重定向到文件中,该文件就是补丁文件,如:

1
2
3
4
5
# 将尚未暂存的部分做成补丁文件
git diff > patch

# 将暂存区的文件做成补丁文件
git diff --cached > patch

根据补丁文件更新

1
2
3
4
5
6
7
8
# 在其他机器上对应目录下使用下面命令根据patch文件更新
git apply patch

# 检验一下补丁能否应用,如果没有任何输出,那么表示可以顺利接受这个补丁
git apply --check patch

# 有冲突的会生成.rej文件,此时可以找到这些文件进行手动打补丁 
git apply --reject patch