git diff
主要是用来比较差异的, 用来比较分支,提交,或者暂存区,文件差异或者文件树差异
1. 基本概念
- 默认的diff是工作区和暂存区(stage or index)比较的,如果stage没有的就直接从HEAD比较
- 在只有一个索引或者分支参数的时候,默认是将工作区和参数进行比较
- diff的实质是比较两个索引, 拿后面的索引和前面的比较, 展示的时候后面的索引发生的变化
- diff是可以调换索引的,如果索引反过来,那么diff显示的内容就反过来了
- 两个索引
- 在使用
..
的情况下,如果省略一个那么省略的将被替换为HEAD
- commit1 可选, 默认是stage(没有的会向上找HEAD)
- commit2 可选, 默认是工作区
- 特殊情况
有--cached
的时候那么commit1就是暂存区, commit2如果为空就是工作区
如果想清晰的决定diff的索引和方向,可以使用..
比如下面,3个输出完全不同
1
2
3
4
5
6
7
8
|
# 将工作区和HEAD的上一次提交比较
git diff --stat HEAD~
# 将HEAD~和HEAD进行比较, 省略的会被替换为HEAD
git diff --stat HEAD~..
# 将HEAD和HEAD~进行比较, 省略的会被替换为HEAD
git diff --stat ..HEAD~
|
还有一种特殊的用法是A...B
(可以使分支,也可以是commit), 当出现3个点的时候,就是从AB的分叉点,到B的比较,也就是说,找到
AB的共同祖先的commit,拿来和B做比较,看下图
1
2
3
|
1829h --- asd01 --- asdj9 ---oi1ub --- A
\
vbqw2 --- uash2 --- aop23 --- B
|
如果执行
那么,其实就是比较1829h
和B
下图是git-diff的简单总结
下图是git-diff
的简单总结

2. 常用选项
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 只列出有差异的文件和摘要 不显示具体差异
--stat
# 将暂存区和其它索引比较,没有索引参数的时候默认是HEAD
--cached
# 只显示文件,极为简单
--raw
# 输出示例
:100644 000000 ef1c614 0000000 D assets/css/_base/_code.scss
:100644 000000 d8642fd 0000000 D assets/css/_base/_variables.scss
:100644 000000 d596b16 0000000 D assets/css/_common/_animation.scss
:100644 000000 81c6f31 0000000 D assets/css/_common/_normalize.scss
:100644 000000 2485f76 0000000 D assets/css/_common/_utils.scss
:100644 000000 d3f5a12 0000000 D assets/css/_partial/_header.scss
:100644 000000 e2e2967 0000000 D assets/css/_style.scss
:100644 100644 5537bf7 0000000 M assets/css/main.scss
# 输出到文件
--output=<file>
|
3. 使用方法
3.1. 常用
1
2
3
4
5
6
7
8
9
10
|
# 比较整个工作区
git diff
# 比较文件
git diff file
# 比较暂存区(和HEAD)
git diff --cached
# or
git diff --cached HEAD
|
3.2. 具体到文件或者目录
1
2
|
git diff --stat -- layouts
git diff --stat -- layouts/_default/single.html
|
3.3. 比较两个索引
1
|
git diff commit1 commit2
|
3.4. 比较分支
1
|
git diff develop master
|
3.5. 生成补丁
1
2
3
|
# 生成
git diff > patch
git apply patch
|
4. 参考