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命令常見用法
- 比較工作區與暫存區:
git diff
命令,不加引數即預設比較工作區與暫存區。 - 比較暫存區與最新本地版本庫(本地庫中最近一次
commit
的內容):
git diff --cached
命令或者git diff --staged
命令(1.6.1版本以上)。 - 比較工作區與最新本地版本庫:
git diff HEAD
命令,如果HEAD
指向的是master
分支,那麼HEAD
還可以換成master
。 - 比較工作區與指定
commit
提交的差異:
git diff commit-id
命令。 - 比較暫存區與指定
commit
提交的差異:
git diff --cached commit-id
命令。 - 比較兩個
commit
提交之間的差異:
git diff [<commit-id>] [<commit-id>]
命令。 - 使用
git diff
命令打補丁,這個用法以後會詳解,知道有這麼回事就行。
提示:以上就不詳細說明了,看前面舉例兩個例子,其他同理。
5、總結
以現在學到的知識點,git diff
命令能解決我們兩個問題:
- 檢視當前做的哪些更新還沒有暫存?
需要檢視細節的時候,使用git diff
命令。 - 檢視有哪些更新已經暫存起來,準備好了下次提交?
需要檢視細節的時候,使用git diff --cached
命令或者git diff --staged
命令。
參考: