LV030-查看差异
前边我们可以通过 git status 命令的输出文件的状态,但是我们想知道具体修改了什么地方怎么办?我们可以用 git diff 命令。 接下来就来了解一下 git diff 吧,通常可能会用它来回答这几个问题:当前做的哪些更新尚未暂存? 有哪些更新已暂存并准备好下次提交?两次提交之间有什么差异?我们可以
【说明】本节笔记的相关操作在 Windows 下进行,因为 VS Code 有个 Git 的插件,可以很直观的演示一些东西。由于 Git 安装后自带一个 Git-Bash 终端,所以就不用 Win 下的命令行啦,就用的这个终端,因为它里边的命令与 Linux 很类似,而 windows 中的命令行有些命令与 linux 并不相同,为了统一,还是用用 Git 自带的终端啦。另外 VS Code 是可以选择使用的终端的,我直接将 VS Code 使用的终端改成了 git-bash,这样更方便一些。
一、查看未暂存的差异
1. 命令说明
git diff <file_name>此命令比较的是工作目录中当前文件和暂存区域快照之间的差异。 也就是修改之后还没有暂存起来的变化内容。file_name 表示我们单独查看某一文件的差异,可以包含路径。不加 file_name 的话表示查看所有更改的文件差异。
2. 使用实例
git diff 能通过文件补丁的格式更加具体地显示哪些行发生了改变。我们还是用上一节的仓库做测试。我们修改 main.c 文件:

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

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

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

我们执行一下 diff 命令:
git diff
会发现,只显示了未提交到咱暂存区的修改,那我们加上 --staged 参数试一下:
git diff --staged
我们加上 --cached 运行一下:
git diff --cached
发现其实与 git diff --staged 一样,还以为有什么不同呢。
四、查看任意两次提交差异
我们要是想要查看两次提交记录的差异,怎么办呢?
1. 命令说明
我们可以执行下边的命令:
git diff commit_hash_1 commit_hash_2 <file_name>这个命令将会显示 commit_hash_2 相对于 commit_hash_1 的更改。不加 file_name 的话表示查看所有更改的文件差异。
2. 使用实例
我们先看一下提交记录:
git mylog
我们就以下边两次提交为例:
* [qidaink] 65b2acb : feat:C1功能开发 (2023-06-23 08:56:56)
* [qidaink] 859b8ea : feat:C0功能开发 (2023-06-23 08:56:15)我们执行下边的命令:
git diff 859b8ea 65b2acb我们会看到有以下输出信息:

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

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

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

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

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

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

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

6.1.3 使用实例
这样相当于我们执行的是脚本,我们要更换一下命令:
git diffall
git diffall --staged
git diffall commit_hash_1 commit_hash_26.2 方案二
方案二我感觉更合适一些,那就是直接比较则合格那个文件夹,加上 --dir-diff 参数
git difftool --dir-diff
git difftool --staged --dir-diff
git difftool commit_hash_1 commit_hash_2 --dir-diff我们来比较两次提交的差异:
$ git mylog
* [qidaink] c77f6a7 : feat:git difftool测试 (HEAD -> master) (2023-06-23 15:01:16)
* [qidaink] 95f3a07 : feat:添加readme文件 (origin/master) (2023-06-23 14:47:53)我们执行以下命令:
git difftool 95f3a07 c77f6a7 --dir-diff然后打开是这样的:

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