比较文件
1.本地文件<->
本地文件
diff file_a file_b
这是系统提供的比较命令,用于比较本地文件或已经提交到版本库的文件。创建文件a
和文件b
,使用上述指令进行比较:
在diff -u a b
的输出信息中:
加上参数-u可以更详细地显示比较信息。
--- a
表示a
为原文件;+++ b
表示b
为目标文件;-1,3
中-
表示原文件即a
,1
表示原文件中的第一行,3 表示到第3行。合起来的意思为:在原文件a中的1~3行;- 同理:
+1,3
表示:目标文件b
中的1~3
行; - 数据前面有三种符号,分别表示不同的信息:
- 空格:表示该行在两个文件中都存在,如上图所示
AABB
这一行文件a
,b
都有; -
- :表示原文件
a
去掉该行就能变为目标文件b
;
- :表示原文件
-
- :表示原文件
a
加上该行就能变为目标文件b
; 所以整个输出信息的意思为:AABB
这一行两文件都有,只要原文件a
去掉:
- :表示原文件
a1 a2
并加上:
a1 a2
就能变为目标文件b
;
2.工作区<-
暂存区
以下为git
提供的比较命令,作用为:比较暂存区和工作区中的同一文件。并且:原始文件为暂存区中的文件,目标文件为工作区中的文件。示例如下:
git diff
首先,新建文件A.txt
和B.txt
,修改其内容并提交到暂存区:
然后,在工作区中再次修改文件A.txt
与B.txt
的内容:
在git diff
的输出信息中:
--- a/A.txt
:表示原文件为暂存区中的A.txt
;+++ b/A.txt
:表示目标文件为工作区中的A.txt
;-1
:其中-
表示原文件,1
表示从第1行开始。由于暂存区中的A.txt
文件(原文件)只有1行,所以将原来的(-1,1)
简写为-1
;+1,2
:其中+
表示目标文件,1,2
表示工作区中的A.txt
文件(目标文件
)从第1行开始有2行;hello world
:表示原文件和目标文件中都存在的内容;+hello java
表示暂存区中的A.txt
加上该行,就能变得与工作区中的A.txt
一样;
可以看到该指令是将同一文件的工作区
版本与暂存区
版本进行比较,各比各的,并不会将A.txt
与B.txt
进行比较。
3.工作区<-
版本库¶
以下指令作用为:比较版本库和工作区中的同一文件。并且:原始文件为版本库中的文件,目标文件为工作区中的文件。
git diff commit_id
用于比较指定commit id
提交上的A
文件和工作区中的A
文件
git diff HEAD
用于比较最新提交上的A
文件和工作区中的A
文件:
上面的
A
文件仅为一个示例,以下同理。
如下图所示,先初始化test.txt
为:版本库中的修改,然后进行一次提交;随后在工作区中为test.txt
添加工作区的修改;然后执行上述比较指令,从显示出来的比较结果可知,工作区中的test.txt
文件比最新一次提交的test.txt
文件多了一行工作区中的修改内容。
4.暂存区<-
版本库
以下指令作用为:比较版本库和暂存区中的同一文件,其中原始文件为版本库中的文件,目标文件为暂存区中的文件:
git diff --cached commit_id
用于比较指定提交上的A
文件和暂存区中的A
文件;
git diff --cached
用于比较最新提交上的A
文件和暂存区中的A
文件。示例如下:
可以看到,暂存区中的A.txt
文件比最新提交中的A.txt
文件多了一行hello java
;暂存区中的B.txt
文件比最新提交中的B.txt
文件多了一行hello java2
。
5.总结
关于目标文件与原始文件的判定,遵循的顺序为:工作区<-
暂存区<-
版本库(提交);
上述比较指令的比较如下表所示:
指令 | 作用 | 原始文件 | 目标文件 |
---|---|---|---|
diff <file1> <file2> |
比较两个本地文件 | 本地文件/版本库 | 本地文件/版本库 |
git diff |
比较暂存区和工作区中的同一文件 | 暂存区 | 工作区 |
git diff commit_id |
比较指定commit id 提交上的A 文件和工作区中的A 文件 |
版本库 | 工作区 |
git diff HEAD |
比较最新提交上的A 文件和工作区中的A 文件 |
版本库 | 工作区 |
git diff --cached commit_id |
比较指定提交上的A 文件和暂存区中的A 文件 |
版本库 | 暂存区 |
git diff --cached |
比较最新提交上的A 文件和暂存区中的A 文件 |
版本库 | 暂存区 |
表格中的
A
文件仅为示例。