git 仓库工作区与版本库

使用git init初始化仓库时会在当前工作目录下生成.git目录,该目录属于 git 的版本库,存储项目的完整历史快照。它包含暂存区(索引区,使用git add添加)和本地对象库(git commit添加),而我们进行编码的当前工作目录属于工作区

1
2
3
graph TD
A[工作区] -->|git add| B[暂存区]
B -->|git commit| E[对象库]

git diff 的四种情况

工作区和暂存区

  • git diff:查看工作区和暂存区所有文件的差异
  • git diff -- {filename}:只查看工作区和暂存区文件{filename}的差异(注意–和{filename}间的空格)
  • git diff -- {filename1} {filename2}:查看工作区和暂存区文件{filename1}、{filename2}的差异(注意空格)

工作区和版本库

  • git diff HEAD : 查看工作区与最新版本库之间所有的文件差异(将 HEAD 替换为某个版本的 commit ID 即可查看工作区与该版本库之间所有的文件差异,下同)
  • git diff HEAD -- {filename} : 查看工作区与最新版本库之间指定文件名{filename}的文件差异
  • git diff HEAD -- {filename1} {filename2} :查看工作区与最新版本库之间指定文件名{filename1}和{filename2}的多个文件差异

暂存区和版本库

  • git diff --cached:查看暂存区和最新版本所有文件的差异
  • git diff --cached commit-ID:查看暂存区和对应 commit-ID 版本所有文件的差异
  • git diff --cached -- {filename}:只查看暂存区和最新版本{filename}的差异(注意空格)
  • git diff --cached -- {filename1} {filename2}:查看暂存区和最新版本文件{filename1}、{filename2}的差异(注意空格)
  • git diff --cached commit-ID -- {filename1} {filename2}:查看暂存区和对应 commit-ID 版本文件{filename1}、{filename2}的差异(注意空格)

不同版本之间

  • git diff commit-ID1 commit-ID2 : 查看 commit-ID1 和 commit-ID2 两个版本之间的差异
  • git diff commit-ID1 commit-ID2 -- {filename1} {filename2} : 查看 commit-ID1 和 commit-ID2 两个版本之间的指定文件之间的差异
  • git diff commit-ID1 commit-ID2 --stat : 查看两个版本之间改动的文件列表
  • git diff commit-ID1 commit-ID2 {dir} : 查看两个版本之间指定文件夹{dir}的差异

git diff 输出说明

运行git diff后针对每个有所变动的文件会输出类似如下的信息:

1
2
3
4
5
6
diff --git a/README.md b/README.md
index 9cd36ec..bd12f10 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,8 @@
...

其中,对于--- a/README.md+++ b/README.md来说,@@ -1,3 +1,8 @@后的内容每行前为-表示只属于 a/README.md 文件(可以理解为删除的内容行),每行前为+表示只属于 b/README.md(可以理解为新增的内容行),否则是两者均有的内容行(可以理解为没有修改过的内容行)
其中,对于@@ -1,3 +1,8 @@来说:

  • -  表示第 1 个文件,即 a/README.md
  • +  表示第 2 个文件,即 b/README.md
  • @@ -1,3 +1,8 @@  表示比较的区块为第 1 个文件的第 1 3 行,第 2 个文件的第 18 行
  • +new line in work dir  新增的内容

参考:
Git 的三大工作区域:工作区、暂存区、本地仓库 - 技术栈
Git 基本命令 – 你用过 git diff 吗?补习一下吧
Git 基础-git diff 比较文件的差异-CSDN 博客
[git] 看懂 git diff,及其输出信息 - 一人庸 - 博客园