LV01-Git-04-Git本地仓库-08-查看差异

本文主要是Git中分支的管理的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
Windows windows11
Ubuntu Ubuntu16.04的64位版本
VMware® Workstation 16 Pro 16.2.3 build-19376536
点击查看本文参考资料
点击查看相关文件下载
--- ---

【说明】本节笔记的相关操作在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文件:

image-20230623135309340

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

1
git diff

然后我们可以在终端看到以下信息:

image-20230623135354357

可以看到我们新添加的内容前边会有一个 + 号,删除的内容会有一个 - 号,添加的内容后边有个 ^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
2
git add .
git diff
image-20230623135957218

发现,好像什么也没输出,那怎么办呢?我们可以加上--staged参数:

1
git diff --staged

然后我们就能看到差异之处啦:

image-20230623140104863

当我们修改完文件,通过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文件:

image-20230623140729587

我们执行一下diff命令:

1
git diff
image-20230623140830808

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

1
git diff --staged
image-20230623140940477

我们加上--cached运行一下:

1
git diff --cached
image-20230623141450391

发现其实与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
image-20230623142939718

我们就以下边两次提交为例:

1
2
* [qidaink] 65b2acb : feat:C1功能开发  (2023-06-23 08:56:56) 
* [qidaink] 859b8ea : feat:C0功能开发 (2023-06-23 08:56:15)

我们执行下边的命令:

1
git diff 859b8ea 65b2acb

我们会看到有以下输出信息:

image-20230623143202474

我们把两次提交反过来:

1
git diff 65b2acb 859b8ea

我们会看到有以下输出信息:

image-20230623143250893

对比一下就可以看到有什么区别了。

五、使用BeyondCompare作为diff工具

其实我们还可以配置diff工具,让我们在敲git diff的时候调用工具来对比文件的变化。BeyondCompare这个软件就是我们常用的比较工具,但是不是免费的,这里就不写怎么获取啦。

1. 配置diff工具

1.1 命令行配置

我们直接在终端执行以下命令:

1
2
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"文件,在配置文件添加以下内容:

1
2
3
4
[diff]
tool = bc
[difftool "bc"]
cmd = "\"C:/LenovoSoft/BeyondCompare/Beyond Compare/BCompare.exe\" \"$LOCAL\" \"$REMOTE\""

2. 调用工具

我们配置了工具之后,后边想查看差异,可以将前边所学习的git diff改成git difftool

1
2
3
git difftool <file_name>
git difftool --staged <file_name>
git difftool commit_hash_1 commit_hash_2 <file_name>

3. 文件准备

为了便于测试,我们将前边测试的内容全部撤销:

1
2
git reset HEAD .  # 撤销暂存区所有的暂存修改
git checkout -- . # 撤销工作目录下所有的文件修改

然后我们再创建一个文件提交,一会可以查看有多个文件修改的时候的情况:

1
2
3
touch readme.md
git add .
git commit -m "feat:添加readme文件"

然后我们修改这两个文件:

image-20230623144957270

4. 调用difftool

我们执行以下命令:

1
git difftool

然后终端会弹出以下提示信息:

image-20230623145122623

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

image-20230623145222670

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

image-20230623145314624

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

image-20230623145410360

当所有发生改变的文件都显示完了,终端也会退出。

5. 关闭询问

我们发现每个文件都要在终端询问一次,我们都需要输入Y才能查看差异,有什么解决办法吗?当然有啦:

1
2
git difftool -y                                 # 临时解决办法
git config --global --add difftool.prompt false # 永久解决

然后有多个文件更改的时候,还是会串行的一个一个打开(上一个关闭后才能打开下一个),但是不需要我们输入Y来确认是否需要打开了。

6. 一次打开所有有差异的文件?

6.1 方案一

6.1.1 创建git-diffall文件

我们创建一个名为git-diffall的文件,没有扩展名,并输入以下内容:

1
2
3
4
#!/bin/sh
git diff --name-only "$@" | while read filename; do
git difftool "$@" --no-prompt "$filename" &
done

6.1.2 将文件放入git目录

然后将文件放在git安装目录的cmd文件夹中,例如C:\Program Files\Git\cmd

image-20230623151447940

6.1.3 使用实例

这样相当于我们执行的是脚本,我们要更换一下命令:

1
2
3
git diffall
git diffall --staged
git diffall commit_hash_1 commit_hash_2

6.2 方案二 

方案二我感觉更合适一些,那就是直接比较则合格那个文件夹,加上--dir-diff参数

1
2
3
git difftool --dir-diff
git difftool --staged --dir-diff
git difftool commit_hash_1 commit_hash_2 --dir-diff

我们来比较两次提交的差异:

1
2
3
$ 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)

我们执行以下命令:

1
git difftool 95f3a07 c77f6a7 --dir-diff

然后打开是这样的:

image-20230623152110159

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