『現學現忘』Git基礎 — 21、git diff命令

繁華似錦Fighting 發表於 2022-05-06
Git

1、git diff 命令說明

commit操作之前,我們通常要確定一下自己在什麼地方更改了程式碼,看看有沒有誤操作程式碼,這個時候git status命令的顯示就比較簡單了,僅僅是列出了修改過的檔案,如果要檢視具體修改了什麼地方,就可以使用git diff命令。

比較有用的選項:--stat:顯示有多少行發生變化,簡潔的展示差異。

2、比較工作區與暫存區中檔案的差別

檢視工作區與暫存區內容的區別,使用無選項的git diff命令。

git diff file_name:獲取指定檔案的修改。

(1)首先在工作目錄中建立一個hello.html檔案,並新增到暫存區。

# 1.檢視工作目錄中的檔案狀態
[email protected] MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
nothing to commit, working tree clean

# 2.建立hello.html檔案
[email protected] MINGW64 /j/git-repository/learngit (master)
$ echo "hello git" > hello.html

# 3.把hello.html檔案新增到暫存區
[email protected] MINGW64 /j/git-repository/learngit (master)
$ git add hello.html

(2)向hello.html檔案新增一行新的內容,之後檢視工作區與暫存區hello.html檔案的區別。

# 1.向hello.html檔案新增內容
[email protected] MINGW64 /j/git-repository/learngit (master)
$ echo "new one line" >> hello.html

# 2.比較工作區與暫存區中hello.html檔案的區別
[email protected] 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`選項作用:簡潔的展示差異
[email protected] MINGW64 /j/git-repository/learngit (master)
$ git diff hello.html --stat
fatal: option '--stat' must come before non-option arguments
# 錯誤提示:選項“--stat”必須位於非選項引數之前

# 正確寫法,只顯示了簡要的內容
[email protected] 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檔案新增到暫存區中
[email protected] MINGW64 /j/git-repository/learngit (master)
$ git add hello.html

# 在執行命令檢視hello.html檔案
[email protected] 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檔案提交到本地版本庫中。

[email protected] 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檔案
[email protected] MINGW64 /j/git-repository/learngit (master)
$ echo "new two two line" >> hello.html

# 新增到暫存區
[email protected] MINGW64 /j/git-repository/learngit (master)
$ git add hello.html

(3)比較暫存區和本地版本庫中hello.html檔案的區別。

[email protected] 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命令。

參考: