当前位置: 首页 > web >正文

【Git】View Submitted Updates——diff、show、log

在这里插入图片描述

在 Git 中查看更新的内容(即工作区、暂存区或提交之间的差异)是日常开发中的常见操作。以下是常用的命令和场景说明:

文章目录

  • 1、查看工作区与暂存区的差异
  • 2、查看提交历史中的差异
  • 3、查看工作区与最新提交的差异
  • 4、查看两个提交之间的差异
  • 5、查看某次提交的单个文件差异
  • 6、图形化工具
  • 7、常用选项
  • 8、总结
  • 附录A——git 如何查看历史提交文件的 md5sum 值
  • 附录B——git log 如何下滑到最后
  • 附录C——工作区 vs 暂存区

1、查看工作区与暂存区的差异

命令:git diff

作用:显示工作区中已修改但未暂存(未执行 git add)的文件内容变化。

示例:

git diff  # 查看所有文件的差异
git diff path/to/file  # 查看指定文件的差异

命令:git diff --stagedgit diff --cached

作用:显示已暂存(执行过 git add)但未提交的文件内容变化。

示例:

git diff --staged

2、查看提交历史中的差异

命令:git log -p

作用:查看提交历史,并显示每次提交的代码差异(-p 表示显示补丁内容)。

示例:

git log -p -2  # 查看最近2次提交的差异

-p 仅显示描述信息


命令:git show <commit-hash>

作用:查看某次提交的详细信息,包括修改的文件和具体内容差异。

示例:

git show HEAD  # 查看最新提交的差异
git show abc123  # 查看指定提交哈希的差异

3、查看工作区与最新提交的差异

命令:git diff HEAD

作用:比较工作区与最新提交(HEAD)之间的所有差异(包括未暂存的修改)。

示例:

git diff HEAD

4、查看两个提交之间的差异

命令:git diff <commit1> <commit2>

作用:比较两个提交之间的代码差异。

示例:

git diff abc123 def456  # 比较两次提交的差异
git diff HEAD~2 HEAD  # 比较当前提交与前两次提交的差异

5、查看某次提交的单个文件差异

命令:git show <commit-hash>:<file-path>

作用:查看某次提交中指定文件的修改内容。

示例:

git show HEAD:src/main.c  # 查看最新提交中 main.c 文件的修改

6、图形化工具

如果习惯图形化界面,可以使用以下工具:

gitk:Git 自带的图形化历史查看工具。

gitk  # 打开图形化界面

VS Code、IntelliJ 等 IDE:内置 Git 插件,支持可视化查看差异。

7、常用选项

--name-only:仅显示修改的文件名,不显示具体内容。

bash

git diff --name-only

--stat:显示修改的统计信息(如增删行数)。

git diff --stat

8、总结

在这里插入图片描述

附录A——git 如何查看历史提交文件的 md5sum 值

在 Git 中,直接查看历史提交文件的 MD5 哈希值(或其他哈希值)并不是一个内置功能,但可以通过组合 Git 命令和外部工具(如 md5sum)来实现。

方法 1:通过 git show 和管道计算 MD5(推荐,简洁明了)

使用 git show 获取文件内容,然后通过管道传递给 md5sum(Linux/macOS)。

Linux/macOS 示例:

git show <commit-hash>:<file-path> | md5sum

示例:

git show HEAD:src/main.c | md5sum

方法 2:通过 git cat-file 获取文件内容并计算 MD5(半推荐,指令会长一些)

第一步:使用 git rev-parse 获取文件在某次提交中的 Blob 哈希。

第二步:通过 Blob 哈希获取文件内容并计算 MD5

git cat-file -p $(git rev-parse <commit-hash>:<file-path>) | md5sum

示例

git cat-file -p $(git rev-parse HEAD:src/main.c) | md5sum

方法 3:导出历史文件版本后计算 MD5(不太推荐,需要导出(覆盖、替换)文件)

第一步:导出某次提交的文件到工作区

git checkout <commit-hash> -- <file-path>

eg

git checkout abc123 -- src/main.c

第二步:计算导出的文件的 MD5

md5sum src/main.c

方法 4:批量查看历史提交的 MD5(脚本实现)

如果需要批量查看某个文件在不同提交中的 MD5,可以编写脚本(以 Linux/macOS 为例):

#!/bin/bash
FILE_PATH="src/main.c"
for commit in $(git rev-list HEAD -- $FILE_PATH); domd5=$(git show $commit:$FILE_PATH | md5sum | awk '{print $1}')echo "Commit $commit: MD5=$md5"
done

注意事项

  • 跨平台兼容性:Windows 用户需使用 CertUtil 或安装 md5sum 工具(如 Git Bash 自带)。

  • 大文件性能:对于大文件,管道操作可能较慢,建议使用方法 3(导出文件后计算)。

  • Git 历史记录:如果文件被重命名或移动,需使用 git log --follow <file-path> 跟踪完整历史。

附录B——git log 如何下滑到最后

在这里插入图片描述

图方便可以离线分析,git log > log.txt

附录C——工作区 vs 暂存区

在 Git 中,工作区(Working Directory)和暂存区(Stage/Index)是版本控制流程中的两个关键概念,它们共同协作以实现代码的有效管理和版本控制。

一、工作区(Working Directory)

定义:

  • 工作区是指开发者在本地计算机上实际编辑和修改文件的区域。简单来说,就是你在计算机上看到的项目文件夹,里面包含了你当前正在处理的代码文件、资源文件等。

特点:

  • 动态性:工作区的文件状态会随着你的编辑操作而实时变化。
  • 非版本控制:默认情况下,工作区的文件不受 Git 版本控制,除非你明确地将它们添加到 Git 的管理中。

作用:

  • 开发者在这里进行代码的编写、修改和测试。
  • 是开发者与项目交互的直接界面。

二、暂存区(Stage/Index)

定义:

  • 暂存区是 Git 中的一个特殊区域,用于临时保存即将被提交到版本库的更改。它像一个“购物车”,你可以在这里挑选和整理要提交的更改。

特点:

  • 临时性:暂存区中的更改只是临时保存,还没有真正成为版本库的一部分。
  • 可控性:你可以自由地选择将哪些更改添加到暂存区,以及从暂存区中移除哪些更改。

作用:

  • 精细化控制:允许你选择性地提交更改,而不是一次性提交所有工作区的更改。
  • 准备提交:在提交更改到版本库之前,先在暂存区中进行整理和确认。

三、工作区与暂存区的协作流程

  • 修改文件:在工作区中编辑和修改文件。
  • 添加到暂存区:使用 git add 命令将修改后的文件添加到暂存区。此时,这些更改就被标记为“待提交”。
  • 提交到版本库:使用 git commit 命令将暂存区中的更改提交到版本库。提交后,暂存区中的更改就被永久地记录在版本库中,同时暂存区被清空,等待下一次的更改添加。

四、示例说明

假设你正在开发一个项目,并修改了几个文件。现在,你想将这些更改提交到版本库中:

(1)在工作区中修改文件:你编辑了 file1.txt 和 file2.txt。

(2)添加到暂存区

git add file1.txt file2.txt

这样,file1.txt 和 file2.txt 的更改就被添加到了暂存区。

(3)提交到版本库

git commit -m "修改了 file1.txt 和 file2.txt"

提交后,这些更改就被永久地记录在版本库中。

工作区和暂存区是 Git 版本控制流程中的两个重要环节。工作区是开发者进行代码编辑和修改的地方,而暂存区则是用于临时保存即将被提交到版本库的更改的区域。 通过合理地使用这两个区域,开发者可以更加精细地控制代码的提交过程,确保版本库中的代码始终保持整洁和有序。

http://www.xdnf.cn/news/9816.html

相关文章:

  • go并发编程| channel入门
  • react库:class-variance-authority
  • GPU层次结构(Nvidia和Apple M芯片,从硬件到pytorch)
  • pyinstaller 使用 控制台闪退解决办法
  • 家庭智能监控系统实现实时监控主要依托传感器网络
  • 长安链智能合约命令解析(全集)
  • [Windows] 摸鱼小工具:隐藏软件(重制版)
  • 深入理解 Maven 循环依赖问题及其解决方案
  • 【Python Cookbook】迭代器与生成器(四)
  • 【Java Web】速通HTML
  • 电机控制选 STM32 还是 DSP?技术选型背后的现实博弈
  • day13 leetcode-hot100-24(链表3)
  • 如何利用categraf的exec插件实现对Linux主机系统用户及密码有效期进行监控及告警?
  • 序列化与反序列化
  • 【电路笔记 TMS320F28335DSP】McBSP 从源时钟得到 生成时钟 CLKG 帧同步信号 FSG
  • 【ARM】【FPGA】【硬件开发】Chapter.1 AXI4总线协议
  • 智能穿戴新标杆:SD NAND (贴片式SD卡)与 SOC 如何定义 AI 眼镜未来技术路径
  • pikachu靶场通关笔记08 XSS关卡04-DOM型XSS
  • uniapp 开发企业微信小程序时,如何在当前页面真正销毁前或者关闭小程序前调用一个api接口
  • 华为OD机试真题——Boss的收入(分销网络提成计算)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • Hive自定义函数案例(UDF、UDAF、UDTF)
  • kafka学习笔记(三、消费者Consumer使用教程——从指定位置消费)
  • PostgreSQL数据库配置SSL操作说明书
  • Java互联网大厂面试:从Spring Boot到Kafka的技术深度探索
  • ai工具集:AI材料星ppt生成,让你的演示更出彩
  • Codeforces Round 1025 (Div. 2)
  • springcloud openfeign 请求报错 java.net.UnknownHostException:
  • 小型语言模型:为何“小”才是“大”?
  • 【Python】3.函数与列表
  • RFID测温芯片助力新能源产业安全与能效提升