Git手册 - Git Diff

2021-05-05
git
约 953 字 预计阅读 2 分钟

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

如果执行

1
git diff A...B

那么,其实就是比较1829h和B

下图是git-diff的简单总结

下图是git-diff的简单总结

image-20210527102955086

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. 参考

TAG: git scm
文章作者 : Cocding