git diff、git diff head、git diff --cached三者详细区分
git-diff - Show changes between commits, commit and working tree, etc
git diff 显示提交与提交之间、提交与工作树之间的文件修改。
- git diff 显示本地开发工作中已经修改但未提交至暂存区的文件和已经提交至暂存区文件的修改
- git diff HEAD 显示的是已提交到工作树中文件和未提交到工作树中文件的所有修改。查看已缓存的与未缓存的所有改动。
- git diff --cached 上一次最后一次提交到工作树中文件(也就是head)与暂存区内文件的改动。查看已缓存的改动。
总结一下,可以想象有三个环境,一个是我们本地正在编辑的开发环境,一个我们提交的版本库环境,还有中间一个暂时存放代码的暂存区。
git diff 就是我们本地正在开发的但未提交到暂存区文件和之前已经提交到暂存区里的文件的对比;
git diff head 就是已经提交到版本库环境中的文件和未提交到版本库环境中文件的所有修改对比;
git diff --cached 最后一次提交到版本库环境中文件和暂存区中文件的修改对比;
具体可以看下面例子:
- 显示本地开发工作中已经修改但未提交至暂存区的文件和已经提交至暂存区文件的修改
未使用过git add命令,使用git diff没有任何文件修改会显示。
使用一次git add命令,再修改文件,再使用git diff显示本地开发工作中已经修改但未提交至暂存区的文件和已经提交至暂存区文件的修改!
例如:在D盘中新建文件夹test,在test文件夹中 git init demo 初始化一个版本,在demo中新建一个a.txt文件,a.txt中输入数字 1
此时使用git diff不会出现任何文件修改信息,因为现在暂存区、提交版本库中都没有任何文件。
使用git add . 将a.txt 添加到暂存区中,此时 使用 git diff 命令,也不会出现任何修改信息,因为此时暂存区内文件和本地开发文件是一样的。
再次修改 a.txt,在a.txt中添加2,再使用 git diff命令
这次git diff显示的就是文件a.txt和暂存区(就是刚才add到暂存区里只有数字 1 的a.txt 的文件的修改)。
- 查看已缓存的与未缓存的所有改动:git diff HEAD 显示的是已提交到工作树中文件和未提交到工作树中文件的所有修改。
1、当没有对demo版本库执行过git commit命令时,执行git diff head会报警告,警告翻译放到下面了,记下我自己的理解,因为head是指向当前版本库中master的,因为在此之前没有执行过提交命令,所以版本库中是空的,所以找不到目前的工作树。
warning: ignoring dangling symref head
警告:忽略悬挂的symref头
fatal: ambiguous argument 'head': unknown revision or path not in the working tree.
不明确的参数'head':未知的修订或路径不在工作树中。
Use '--' to separate paths from revisions, like this: 'git <command> [<revision>...] -- [<file>...]'
使用“——”将路径与修订分开,如下所示:
“git命令> < <修改>…)——(<文件>…)”
2、执行git commit命令,将上面的a.txt提交到工作树中,再执行git diff head依旧无任何修改区别显示。
3、修改下 a.txt文件,在a.txt中添加 3 ,再次执行 git diff head
4、执行git add将 a.txt 添加到暂存区,再次执行 git diff head。此时执行git diff head返回的结果和没有add之前的结果是一样的。
5、再次修改a.txt,在a.txt中加入4。执行git diff head,执行git diff,进行对比。因为上面第4步中我再次将a.txt添加到暂存区里去了,所以暂存区里的a.txt是包含3的,再一次说明了git diff显示的是本地开发工作中已经修改但未提交至暂存区的文件和已经提交至暂存区文件的修改。git diff head 显示的是已提交到工作树中文件和未提交到工作树中文件的所有修改。
- 查看已缓存的改动。工作树中文件head与暂存区内文件的改动。
直接接着上面的步骤执行 git diff --cached
本地a.txt包含1,2,3,4。暂存区中文件包括1,2,3。已经提交的工作树中包括1,2。