Git-diff用法简介
(1)git diff
**当工作区有改动,临时区为空,diff的对比是“**工作区**与**最后一次commit提交的仓库**的共同文件”;当工作区有改动,临时区不为空,diff对比的是“**工作区**与*暂存区*的共同文件”。
(2)git diff –cached 或 git diff –staged
**显示**暂存区(已add但未commit文件)**和*最后一次commit(HEAD)*之间的所有不相同文件的增删改(git diff –cached和git diff –staged相同作用)
(3)git diff HEAD
**显示**工作目录(已track但未add文件)和暂存区(已add但未commit文件)**与*最后一次commit之间的*的所有不相同文件的增删改。
(3.1)git diff HEAD~X或git diff HEAD^^^…(后面有X个^符号,X为正整数)
*可以查看最近一次提交的版本与往过去时间线前数X个的版本之间的所有同*(3)***中定义文件*之间的增删改。
(4)git diff <分支名1> <分支名2>
比较两个分支上最后 commit 的内容的差别
(4.1) git diff branch1 branch2 –stat 显示出所有有差异的文件(不详细,没有对比内容)
(4.2) git diff branch1 branch2 显示出所有有差异的文件的详细差异(更详细)
(4.3) git diff branch1 branch2 具体文件路径 显示指定文件的详细差异(对比内容)
我们有2个分支:master、dev(dev为develop的缩写,应是开发新功能的Feature分支),查看这两个 branch 的区别,除了上面(abc)还有以下几种方式:
(4.4) git log dev ^master 查看 dev中log有的commit,而 master中log没有的commit
(4.5) git log master..dev查看 dev 中的log比 master 中的log多提交了哪些内容(注意,列出来的是两个点“..”后边(此处即dev)多提交的内容)
(4.6) git log dev…master 不知道谁提交的多谁提交的少,单纯想知道有什么不一样
(4.7) git log –left-right dev…master 在上述情况下,再显示出每个提交是在哪个分支上
注意 commit 后面的箭头,根据我们在 –left-right dev…master 的顺序,左箭头 < 表示是 dev 的,右箭头 > 表示是 master的,截图中表示这三个提交都是在 master 分支上的
git diff 和 git diff –cached 和 git diff HEAD
(a)新建一个文件夹“gitDiffTest”,在里面新建2个txt文档,并写入内容(具体见以下图片)
(b)通过GitBash使用git init,git add -A,git commit –m “First Commit”命令第一次提交。
该操作用于生成第一份commit提交过的版本,用于待会使用git diff等命令用于对比
(c)现在我们修改(a)中的2个txt文档,并添加一个新的txt文档(具体见以下图片)
(d)使用git add命令把added_uncommitted.txt导入暂存区,再用git status命令查看目前情况
在下面的大图片中,我们通过git status看到了有3大分类:“Changes to be committed”,
“Changes not staged for committed”,“Untracked files”,每大分类里面分别有一个1文件,
我们将通过git diff等相似命令,我们便可以体验到不同“git diff等相似命令”对这3大分类
文件用不同的操作和对比。
(e)使用git diff命令,发现Git只对比了“tracked_unadded.txt”文件
(f)使用命令git diff –cached, 发现Git只对比了“added_uncommitted.txt”文件
(g)使用命令git diff HEAD,发现Git对比了“tracked_unadded.txt”文件
和“added_uncommitted.txt”文件
(h)总结:
- **git diff: 当工作区有改动,临时区为空,diff的对比是“**工作区**与**最后一次commit提交的仓库**的共同文件”;当工作区有改动,临时区不为空,diff对比的是“**工作区**与*暂存区*的共同文件”。
- **git diff –cached 或 git diff –staged:显示*暂存区(已add但未commit文件)和最后一次commit(HEAD)*之间的所有不相同文件的增删改
- **git diff HEAD:显示*工作目录(已track但未add文件)和暂存区(已add但未commit文件)**与最后一次commit之间的*的所有不相同文件的增删改
git diff的对比对象的争议
*(a)问题背景:我们在初步接触Git的使用教程时,都会接触到git diff这个命令,当我们在网络上百度git diff更多用法时,很多博客都复制贴贴般地介绍:“*git diff**:显示**工作目录**(working tree)**与****索引区**(**即暂存区快照,index,就是****git add**过的**)**之间的文件变更,即显示未被add的文件变更***”。但是廖雪峰的Git教程的“工作区和暂存区”中提到“一旦提交后,暂存区就没有任何内容,修改被放入版本库”,这就产生了一个矛盾:“暂存区是空的时候,git diff实际对比是‘工作目录与最近一次提交’,而不是对比‘工作目录与暂存区’”。所以git diff到底是干嘛的?我们需要亲自探究一下!*
(b)探究步骤:
(b-1)新建一个文件夹“gitDiff”,在里面新建1个txt文档,并写入内容(具体见以下图片)
(b-2)通过GitBash使用git init,git add -A,git commit –m “First Commit”命令第一次提交。该操作用于生成第一份commit提交过的版本,用于待会使用git diff用于对比
(b-3)现在修改一下1)中新建的txt文档“test.txt” (具体见以下图片)
(b-4)使用git diff命令,获得GitBash中的输出结果
结论1:这里git diff对比的是工作区中被修改的test.txt和仓库中最后一次提交的test.txt。因为工作区中被修改的test.txt并未被add,而且暂存区也是空的。
(b-5)使用git add test.txt命令,再使用git diff命令,获得GitBash中的输出结果
结论2:这里git diff对比的是工作区中被修改的test.txt和被add到暂存区的test.txt,因为被add后暂存区不再为空,所以不再对比仓库中的最后一次提交的了。但因为目前工作区和临时去的内容是一致的,所以上图git diff命令后GitBash没有任何输出。
(b-6)现在再修改一下txt文档“test.txt” (具体见以下图片)
(b-7)使用git diff命令,获得GitBash中的输出结果
结论3:这里git diff对比的是工作区中被修改的test.txt和被add到暂存区的test.txt,同时因为目前工作区和临时去的内容不再一致(因为步骤6进行了文本修改),所以上图git diff命令后GitBash产生了“两个不同文件的对比”的输出。
(c)总结:根据(b)探究步骤的测试与(b)中的3个结论,我们可以得出:
(c-1)当工作区有改动,临时区为空,diff的对比是“工作区与最后一次commit提交的仓库的共同文件”。
(c-2)当工作区有改动,临时区不为空,diff对比的是“工作区与暂存区的共同文件”。
本文参考来源:
[1] https://blog.csdn.net/clxjoseph/article/details/80213315
[2] https://www.cnblogs.com/oxspirt/p/5970101.html
[3] https://blog.csdn.net/AsheAndWine/article/details/78982919
[4] https://blog.csdn.net/whbing1471/article/details/52065448
[5] https://www.jianshu.com/p/bb97fabb475e
[6] https://blog.csdn.net/qq_37281252/article/details/79064638