LV01-Git-04-Git本地仓库-08-查看差异
本文主要是Git中分支的管理的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
Windows | windows11 |
Ubuntu | Ubuntu16.04的64位版本 |
VMware® Workstation 16 Pro | 16.2.3 build-19376536 |
点击查看本文参考资料
参考方向 | 参考原文 |
Git 官网 | https://git-scm.com/ |
Git 官方文档 | https://git-scm.com/doc |
Pro Git Book | https://git-scm.com/book/zh/v2 |
Git 快速使用指南 | https://training.github.com/downloads/zh_CN/github-git-cheat-sheet/ |
Visual Git Cheat Sheet | https://ndpsoftware.com/git-cheatsheet.html#loc=index |
【说明】本节笔记的相关操作在Windows下进行,因为VS Code有个Git的插件,可以很直观的演示一些东西。由于Git安装后自带一个Git-Bash终端,所以就不用Win下的命令行啦,就用的这个终端,因为它里边的命令与Linux很类似,而windows中的命令行有些命令与linux并不相同,为了统一,还是用用Git自带的终端啦。另外VS Code是可以选择使用的终端的,我直接将VS Code使用的终端改成了git-bash,这样更方便一些。
前边我们可以通过 git status
命令的输出文件的状态,但是我们想知道具体修改了什么地方怎么办?我们可以用 git diff
命令。 接下来就来了解一下 git diff
吧,通常可能会用它来回答这几个问题:当前做的哪些更新尚未暂存? 有哪些更新已暂存并准备好下次提交?两次提交之间有什么差异?我们可以
一、查看未暂存的差异
1. 命令说明
1 | git diff <file_name> |
此命令比较的是工作目录中当前文件和暂存区域快照之间的差异。 也就是修改之后还没有暂存起来的变化内容。file_name表示我们单独查看某一文件的差异,可以包含路径。不加file_name的话表示查看所有更改的文件差异。
2. 使用实例
git diff
能通过文件补丁的格式更加具体地显示哪些行发生了改变。我们还是用上一节的仓库做测试。我们修改main.c文件:

这个时候我们只是修改了文件,还未使用git add
添加到暂存区,这个时候我们想要知道做了哪些修改,我们可以直接执行下边的命令:
1 | git diff |
然后我们可以在终端看到以下信息:

可以看到我们新添加的内容前边会有一个 + 号,删除的内容会有一个 - 号,添加的内容后边有个 ^M 是啥意思?那个应该是换行,因为git识别的换行可能跟编辑器敲进去的换行不太一样,就导致了乱码,我记得好像是Git使用的linux下的换行LF,而刚才的文件在Windows中编辑的,换行为CRLF,所以就乱码了,这个问题不大,后边注意就是了。
二、查看已暂存的差异
1. 命令说明
1 | git diff --staged <file_name> |
若要查看已暂存的将要添加到下次提交里的内容,可以用 git diff --staged
命令。 这条命令将比对已暂存文件与最后一次提交的文件差异。file_name表示我们单独查看某一文件的差异,可以包含路径。不加file_name的话表示查看所有更改的文件差异。
2. 使用实例
我们来试一下将刚才的更改提交到暂存区,然后再执行git diff
看一下:
1 | git add . |

发现,好像什么也没输出,那怎么办呢?我们可以加上--staged
参数:
1 | git diff --staged |
然后我们就能看到差异之处啦:

当我们修改完文件,通过git add
将修改添加到暂存区后,在git commit
之前的时候想要查看即将commit
的与最后一次提交的文件的差异的话,就可以用这个命令啦。
三、查看暂存后再编辑的差异
1. 命令说明
1 | git diff --cached <file_name> |
额,貌似跟git diff --staged
没什么区别,--staged
和 --cached
是同义词。file_name表示我们单独查看某一文件的差异,可以包含路径。不加file_name的话表示查看所有更改的文件差异。
2. 使用实例
上边我们将main.c修改后,添加到暂存区,但是还未提交到版本库,但是这个时候,我们又修改了main.c文件:

我们执行一下diff命令:
1 | git diff |

会发现,只显示了未提交到咱暂存区的修改,那我们加上--staged
参数试一下:
1 | git diff --staged |

我们加上--cached
运行一下:
1 | git diff --cached |

发现其实与git diff --staged
一样,还以为有什么不同呢。
四、查看任意两次提交差异
我们要是想要查看两次提交记录的差异,怎么办呢?
1. 命令说明
我们可以执行下边的命令:
1 | git diff commit_hash_1 commit_hash_2 <file_name> |
这个命令将会显示commit_hash_2相对于commit_hash_1的更改。不加file_name的话表示查看所有更改的文件差异。
2. 使用实例
我们先看一下提交记录:
1 | git mylog |

我们就以下边两次提交为例:
1 | * [qidaink] 65b2acb : feat:C1功能开发 (2023-06-23 08:56:56) |
我们执行下边的命令:
1 | git diff 859b8ea 65b2acb |
我们会看到有以下输出信息:

我们把两次提交反过来:
1 | git diff 65b2acb 859b8ea |
我们会看到有以下输出信息:

对比一下就可以看到有什么区别了。
五、使用BeyondCompare作为diff工具
其实我们还可以配置diff工具,让我们在敲git diff
的时候调用工具来对比文件的变化。BeyondCompare这个软件就是我们常用的比较工具,但是不是免费的,这里就不写怎么获取啦。
1. 配置diff工具
1.1 命令行配置
我们直接在终端执行以下命令:
1 | git config --global diff.tool bc |
1.2 修改.gitconfig文件
这里以windows下为例,我么找到"C:\Users\用户名\.gitconfig"
文件,在配置文件添加以下内容:
1 | [diff] |
2. 调用工具
我们配置了工具之后,后边想查看差异,可以将前边所学习的git diff
改成git difftool
:
1 | git difftool <file_name> |
3. 文件准备
为了便于测试,我们将前边测试的内容全部撤销:
1 | git reset HEAD . # 撤销暂存区所有的暂存修改 |
然后我们再创建一个文件提交,一会可以查看有多个文件修改的时候的情况:
1 | touch readme.md |
然后我们修改这两个文件:

4. 调用difftool
我们执行以下命令:
1 | git difftool |
然后终端会弹出以下提示信息:

我们敲下Y然后按下enter按键即可打开beyondcompare软件进行比较:

然后我们关闭这个窗口,会发现终端又出现几行:

由于我们是修改了两个文件,所以这里该查看第二个文件了,我们还是敲个Y就可以了:

当所有发生改变的文件都显示完了,终端也会退出。
5. 关闭询问
我们发现每个文件都要在终端询问一次,我们都需要输入Y才能查看差异,有什么解决办法吗?当然有啦:
1 | git difftool -y # 临时解决办法 |
然后有多个文件更改的时候,还是会串行的一个一个打开(上一个关闭后才能打开下一个),但是不需要我们输入Y来确认是否需要打开了。
6. 一次打开所有有差异的文件?
6.1 方案一
6.1.1 创建git-diffall文件
我们创建一个名为git-diffall
的文件,没有扩展名,并输入以下内容:
1 | !/bin/sh |
6.1.2 将文件放入git目录
然后将文件放在git安装目录的cmd文件夹中,例如C:\Program Files\Git\cmd

6.1.3 使用实例
这样相当于我们执行的是脚本,我们要更换一下命令:
1 | git diffall |
6.2 方案二
方案二我感觉更合适一些,那就是直接比较则合格那个文件夹,加上--dir-diff
参数
1 | git difftool --dir-diff |
我们来比较两次提交的差异:
1 | git mylog |
我们执行以下命令:
1 | git difftool 95f3a07 c77f6a7 --dir-diff |
然后打开是这样的:

不过这样有一点不好,就是要自己记得左右是哪一次提交,beyondcompare上边没有什么说明的地方。