在 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 --staged
或 git 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 版本控制流程中的兩個重要環節。工作區是開發者進行代碼編輯和修改的地方,而暫存區則是用于臨時保存即將被提交到版本庫的更改的區域。 通過合理地使用這兩個區域,開發者可以更加精細地控制代碼的提交過程,確保版本庫中的代碼始終保持整潔和有序。