1、git diff 命令说明

commit操作之前,我们通常要确定一下自己在什么地方更改了代码,看看有没有误操作代码,这个时候git status命令的显示就比较简单了,仅仅是列出了修改过的文件,如果要查看具体修改了什么地方,就可以使用git diff命令。

比较有用的选项:--stat:显示有多少行发生变化,简洁的展示差异。

2、比较工作区与暂存区中文件的差别

查看工作区与暂存区内容的区别,使用无选项的git diff命令。

git diff file_name:获取指定文件的修改。

(1)首先在工作目录中创建一个hello.html文件,并添加到暂存区。

# 1.查看工作目录中的文件状态
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
nothing to commit, working tree clean # 2.创建hello.html文件
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ echo "hello git" > hello.html # 3.把hello.html文件添加到暂存区
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git add hello.html

(2)向hello.html文件添加一行新的内容,之后查看工作区与暂存区hello.html文件的区别。

# 1.向hello.html文件添加内容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ echo "new one line" >> hello.html # 2.比较工作区与暂存区中hello.html文件的区别
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git diff hello.html
diff --git a/hello.html b/hello.html
index 8d0e412..ee5cc3c 100644
--- a/hello.html
+++ b/hello.html
@@ -1 +1,2 @@
hello git
+new one line

说明:

  • diff --git a/hello.html b/hello.html:表示进行比较的是hello.html文件的a版本(即变动前)和b版本(即变动后)。
  • index 8d0e412..ee5cc3c:表示两个版本的hash索引值,前边表示暂存区文件的索引,后边代表工作区中文件的索引。
  • 100644:表示文件模式,100代表普通文件,644代表文件具有的权限(同Linux文件权限)。
  • --- a/hello.html+++ b/hello.html:表示进行比较的两个文件,---表示变动前的版本,+++表示变动后的版本。
  • @@ -1 +1,2 @@:表示代码变动的位置,用两个@作为起首和结束。

    +1,2说明:分成三个部分:

    +表示变动后文件,1表示第一行,2表示连续2行。(也就是从第一行开始,有连续两行的内容。我个人的理解就是表示文件有几行内容。)
  • 最后一部分为文件变动的具体内容,每一行最前面的标志位:

    -代表第一个文件删除的行,用红色表示。

    +表示第二个文件新增的行,用绿色表示。

    无标志表示该行无变动。

这里在简单说明一下--stat选项的作用,如下:

# `--stat`选项作用:简洁的展示差异
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git diff hello.html --stat
fatal: option '--stat' must come before non-option arguments
# 错误提示:选项“--stat”必须位于非选项参数之前 # 正确写法,只显示了简要的内容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git diff --stat hello.html
hello.html | 1 +
1 file changed, 1 insertion(+)

(3)将修改后的hello.html文件添加到暂存区中,再次来查看该文件。

# 1.将修改后的hello.html文件添加到暂存区中
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git add hello.html # 在执行命令查看hello.html文件
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git diff hello.html

没有任何输出,这就说明此时,工作区中hello.html文件的内容,与暂存区中hello.html文件的内容没有区别。

3、比较暂存区与本地库中文件的差别

查看暂存区与本地库中文件内容的区别,使用带--cached选项的git diff命令。

使用命令:git diff --cached file_name

(1)接上面练习,把hello.html文件提交到本地版本库中。

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git commit -m 'add hello.html file'
[master 6b6b1fc] add hello.html file
1 file changed, 2 insertions(+)
create mode 100644 hello.html

(2)修改hello.html文件,然后添加到暂存区。

# 修改hello.html文件
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ echo "new two two line" >> hello.html # 添加到暂存区
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git add hello.html

(3)比较暂存区和本地版本库中hello.html文件的区别。

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git diff --cached hello.html
diff --git a/hello.html b/hello.html
index ee5cc3c..7c88cdc 100644
--- a/hello.html
+++ b/hello.html
@@ -1,2 +1,3 @@
hello git
new one line
+new two two line

从上面文件中可以看出,暂存区中的hello.html文件比本地版本库中的hello.html文件,多出一行new two two line内容。(解读方式同上。)

4、总结git diff命令常见用法

  1. 比较工作区与暂存区:

    git diff命令,不加参数即默认比较工作区与暂存区。
  2. 比较暂存区与最新本地版本库(本地库中最近一次commit的内容):

    git diff --cached命令或者git diff --staged命令(1.6.1版本以上)。
  3. 比较工作区与最新本地版本库:

    git diff HEAD命令,如果HEAD指向的是master分支,那么HEAD还可以换成master
  4. 比较工作区与指定commit提交的差异:

    git diff commit-id命令。
  5. 比较暂存区与指定commit提交的差异:

    git diff --cached commit-id 命令。
  6. 比较两个commit提交之间的差异:

    git diff [<commit-id>] [<commit-id>]命令。
  7. 使用git diff命令打补丁,这个用法以后会详解,知道有这么回事就行。

提示:以上就不详细说明了,看前面举例两个例子,其他同理。

5、总结

以现在学到的知识点,git diff命令能解决我们两个问题:

  • 查看当前做的哪些更新还没有暂存?

    需要查看细节的时候,使用git diff命令。
  • 查看有哪些更新已经暂存起来,准备好了下次提交?

    需要查看细节的时候,使用git diff --cached命令或者git diff --staged命令。

参考:

『现学现忘』Git基础 — 21、git diff命令的更多相关文章

  1. 『现学现忘』Git基础 — 18、Git对象的总结

    目录 1.Git操作最基本的流程 2.工作目录中文件的状态 3.Git效率说明 提示:前面三篇文章已经分别的对blob对象.tree对象.commit对象进行了详细的说明,这篇文章我们总结一下,Git ...

  2. 『现学现忘』Git基础 — 3、Git介绍

    目录 1.Git的历史 2.Git的特点 3.Git在项目协作开发中所解决的问题 1.Git的历史 Git是目前世界上最先进的分布式版本控制系统,开源.免费. Git 是 Linus (林纳斯)为了帮 ...

  3. 『现学现忘』Git基础 — 4、Git下载与安装

    目录 1.Git下载 2.Git在Windows下的详细安装 3.验证Git是否安装成功 1.Git下载 进入官方地址下载Git客户端:https://git-scm.com/download/win ...

  4. 『现学现忘』Git基础 — 11、配置Git用户签名的方式

    目录 1.配置Git签名 (1)语法 (2)配置系统用户签名 (3)配置全局用户签名 (4)配置本地用户签名 2.查看三个配置文件的用户签名 (1)语法 (2)查看项目/仓库级别的配置文件信息(loc ...

  5. 『现学现忘』Git基础 — 12、Git用户签名(补充)

    目录 1.修改用户签名 2.取消用户签名 3.用户签名的优先级 4.总结本文用到的Git命令 1.修改用户签名 其实很简单,就是重新执行git config命令,换个用户名和邮箱地址就可以了,新配置的 ...

  6. 『现学现忘』Git基础 — 14、Git基础操作的总结与补充

    目录 1.Git本地版本库结构 2.Git常用操作方法 3.补充:添加多个文件到暂存区 4.补充:提交操作未写备注 5.补充:从工作区直接提交到版本库 1.Git本地版本库结构 如下图所示: 工作区( ...

  7. 『现学现忘』Git基础 — 19、在Git中进行忽略文件操作

    目录 1.忽略文件说明 2.忽略文件的原则 3..gitignore忽略规则 4.忽略文件的三种方式 (1)忽略单个仓库中的文件(远程共用) (2)忽略单个仓库中的文件(本地使用) (3)全局忽略 1 ...

  8. 『现学现忘』Git基础 — 23、Git中的撤销操作

    目录 1.撤销操作说明 2.撤销工作区中文件的修改 3.撤销暂存区中文件的修改 4.总结 1.撤销操作说明 我们在使用Git版本管理时,往往需要撤销某些操作.比如说我们想将某个修改后的文件撤销到上一个 ...

  9. 『现学现忘』Git基础 — 24、Git中查看历史版本记录

    目录 1.查看详细的历史版本记录 2.简化显示历史版本记录 3.历史版本记录常用操作 (1)指定查看最近几次提交的内容 (2)以简单图形的方式查看分支版本历史 (3)翻页与退出 4.查看分支相关的版本 ...

随机推荐

  1. spring-boot-learning- Elasticsearch

    索引==数据库 类型==表 文档==表里面的记录 属性==表里面的列 使用RestFul风格elasticSearch进行操作 添加一个索引为megacorp,类型为employee,--id为1的文 ...

  2. rbac-基于角色的权限控制系统(8种常用场景再现)

    首先要抛出的问题是在代码世界里什么是权限? url就代表权限 如何实现权限控制? 下面详细介绍控制流程 1.1简单权限控制--表结构 简单权限控制,三个model,五张表 权限表permission ...

  3. 学习Kvm(一)

     背景介绍 传统数据中心面临的问题: 资源使用率低 资源分配不均 自动化能力差 初始化成本高   云计算: 云计算是一种按使用量付费的模式,这种模式提供可用的.便捷的.按需的网络访问, 进入可配置的计 ...

  4. Python turtle 模块可以编写游戏,是真的吗?

    1. 前言 turtle (小海龟) 是 Python 内置的一个绘图模块,其实它不仅可以用来绘图,还可以制作简单的小游戏,甚至可以当成简易的 GUI 模块,编写简单的 GUI 程序. 本文使用 tu ...

  5. Netty学习摘记 —— 预置SSL / HTTP / WebSocket编解码器

    本文参考 本篇文章是对<Netty In Action>一书第十一章"预置的ChannelHandler和编解码器"的学习摘记,主要内容为通过 SSL/TLS 保护 N ...

  6. torch.optim.SGD参数详解

    随机梯度下降法 $\theta_{t} \leftarrow \theta_{t-1}-\alpha g_{t}$ Code: optimzer = torch.optim.SGD(model.par ...

  7. Numpy实现机器学习交叉验证的数据划分

    Numpy实现K折交叉验证的数据划分 本实例使用Numpy的数组切片语法,实现了K折交叉验证的数据划分 背景:K折交叉验证 为什么需要这个?在机器学习中,因为如下原因,使用K折交叉验证能更好评估模型效 ...

  8. Altium Designer PCB文件的绘制(下:PCB布线和检查)

    在完成电路板的布局工作后,就可以开始布线操作了.在PCB的设计中,布线是完成产品设计的最重要的步骤,其要求最高.技术最细.工作量最大.PCB布线可分为单面布线.双面布线.多层布线.布线的方式有自动布线 ...

  9. TL431常用电路整理

    熟悉电路制作的人大多对TL431并不陌生.由于TL431的动态抗阻的特性,其经常在电路设计当中被用于替代稳压二极管.不仅如此,TL431的开态响应速度快输出噪音低,并且价格低廉.因此受到电源工程师和初 ...

  10. SVG Sprite 入门(SVG图标解决方案)

    关于浏览器图标解决方案,一直就有很多 CSS Sprite,Icon Font,CSS Icon以及SVG.相对而言svg矢量图标以及支持浏览器自身解析的优点,很多团队都已经在使用了.这篇文章主要说明 ...