20151230 [學習筆記] Git版本控制(8)
[ 筆記內容 (1) ] 使用 "git diff" 比對檔案與版本差異
  • [前置作業] 準備工作目錄
  • (一)"git diff" 的基本觀念
  • (二)"git diff" 的四種比較方式
  • 1.  git diff    比對「工作目錄」與「索引」之間的差異
  • 2.  git diff commit    比對「工作目錄」與「指定 commit 物件裡的 tree 物件」
  • 3.  git diff --cached commit  比對「當前索引狀態」與「指定 commit 物件裡的 tree 物件」
  • 4.  git diff commit1 commit2    透過兩個不同的版本 ( commit id ) 來比對其差異
 
 
 
 

[ 前置作業 ] 準備工作目錄

  • 建立一個擁有兩個檔案與兩個版本變更紀錄的 Git 儲存庫與工作目錄
# 在命令列中輸入以下指令
## 建立儲存庫 ##
mkdir git-demo
cd git-demo
git init
 
## 建立檔案版本(初版) ##
echo 1 > a.txt
echo 2 > b.txt
git add .
git commit -m "Initial commit"
 
## 建立檔案版本(再版) ##
echo 3 > a.txt
echo 4 > b.txt
git add .
git commit -m "Update a.txt and b.txt to 3 and 4"
 
  • < 執行結果 >
D:\GitHub> mkdir git-demo
 
 
    目錄: D:\GitHub
 
 
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----      2015/12/30  下午 05:23            git-demo
 
 
D:\GitHub> cd git-demo
D:\GitHub\git-demo> git init
Initialized empty Git repository in D:/GitHub/git-demo/.git/
D:\GitHub\git-demo [master]>
D:\GitHub\git-demo [master]> echo 1 > a.txt
D:\GitHub\git-demo [master +1 ~0 -0 !]> echo 2 > b.txt
D:\GitHub\git-demo [master +2 ~0 -0 !]> git add .
D:\GitHub\git-demo [master +2 ~0 -0]> git commit -m "Initial commit"
[master (root-commit) 3efab17] Initial commit
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 a.txt
 create mode 100644 b.txt
D:\GitHub\git-demo [master]> echo 3 > a.txt
D:\GitHub\git-demo [master +0 ~1 -0]> echo 4 > b.txt
D:\GitHub\git-demo [master +0 ~2 -0]> git add .
D:\GitHub\git-demo [master +0 ~2 -0]> git commit -m "Update a.txt and b.txt to 3 and 4"
[master 99e43ba] Update a.txt and b.txt to 3 and 4
 2 files changed, 0 insertions(+), 0 deletions(-)
D:\GitHub\git-demo [master]>
 
 
 
 

(一)"git diff" 的基本觀念

[ 實際操作 ] 比較版本之間的差異
  • 相關資料:
  • STEP_1:取得版本資訊
  • 先執行 "git log" 取得版本資訊,並取得最近兩個 commit 物件的 id。
 
  • STEP_2:比對版本差異
  • 執行 "git diff commit1 commit2" 指令,比對兩個版本間的差異。(其中 commit1 請用較舊的版本,而 commit2 則用較新的版本)
 
  • < 執行結果 >
D:\GitHub\git-demo [master]> git log
commit 99e43baae0a62137c4d1da867c707dab2b70401b
Author: shouzo <danny200026@yahoo.com.tw>
Date:   Wed Dec 30 17:26:06 2015 +0800
 
    Update a.txt and b.txt to 3 and 4
 
commit 3efab178a2f48fec16622e2eedbef6b4d9a3336d
Author: shouzo <danny200026@yahoo.com.tw>
Date:   Wed Dec 30 17:25:05 2015 +0800
 
    Initial commit
D:\GitHub\git-demo [master]> git diff 3efab 99e43
diff --git a/a.txt b/a.txt
index ca90535..00b30ed 100644
Binary files a/a.txt and b/a.txt differ
diff --git a/b.txt b/b.txt
index c7250cb..b1b10c2 100644
Binary files a/b.txt and b/b.txt differ
D:\GitHub\git-demo [master]>
 
 
 
 

(二)"git diff" 的四種比較方式

1.  git diff    比對「工作目錄」與「索引」之間的差異
  • [ 適用情境 ]
  • 在執行 "git add ." 指令之前,先透過 "git diff" 查看你自己到底改了哪些東西。
 
 
2.  git diff commit    比對「工作目錄」與「指定 commit 物件裡的 tree 物件」
  • [ 適用情境 ] 
  • 最常用的指令是 "git diff HEAD"將「工作目錄」與「當前分支的最新版」進行比對
  • 這種比對方法,不會去比對「索引」的狀態。
 
 
3.  git diff --cached commit    比對「當前的索引狀態」與「指定 commit 物件裡的 tree 物件」
  • [ 適用情境 ]
  • 最常用的指令是 "git diff --cached HEAD"將「當前的索引狀態」與「當前分支的最新版」進行比對
  • 這種比對方法,不會去比對「工作目錄」的檔案內容,而是直接去比對「索引」與「目前最新版」之間的差異,這有助於你在執行 git commit 之前找出那些變更的內容,也就是你將會有哪些變更被建立版本的意思。
 
  • [ 補充資訊 ]
  1. "git diff --cached" "git diff --staged" 的執行結果相同。(--staged 是 --cached 的別名)
  1. "git diff --cached" "git diff --cached HEAD" 的執行結果相同。("HEAD" 可以省略)
 
 
4.  git diff commit1 commit2    透過兩個不同的版本 ( commit id ) 來比對其差異
  • [ 適用情境 ]
  • 最常用的指令是 "git diff HEAD^ HEAD"比較「最新版的前一版」與「最新版」之間的差異
  • 這個命令可以跳過「索引」與「工作目錄」的任何變更,直接比對特定的兩個版本。(比對特定兩個版本 commit 物件內的 tree 物件)
 
 
 
 
[ 筆記內容 (2) ] Git 物件的絕對名稱
  • (一)物件絕對名稱
  • [ 技巧1 ] 透過 "git log" 取得 commit 物件 id
  • [ 技巧2 ] 利用 "git cat-file -p commit_id" 查看commit 物件的內容
  • (二)絕對名稱的簡短語法
  • [ 技巧1 ] 透過 "git cat-file -p tree_id" 來取得 tree 物件的內容
  • [ 技巧2 ] 使用 "git log --pretty=oneline" 取得精簡後的 "git log" 紀錄,同時也可取得 commit 物件完整的「絕對名稱」
  • [ 技巧3 ] 使用 "git log --pretty=oneline --abbrev-commit" 取得精簡後的 "git log" 紀錄,和物件部份的「絕對名稱」
 
 
 
 

(一)物件絕對名稱

  • 每個物件都會有一個以 SHA 雜湊運算過的 id,而這個 id 就是所謂的「絕對名稱」。
  • 如果該物件是 commit 物件,那這就是 commit 物件的絕對名稱。>> 所以只要找出 commit 物件的絕對名稱,就可以隨時取得該版本
  • [ 技巧1 ] 透過 "git log" 取得 commit 物件 id:
 
  • [ 技巧2 ] 利用 "git cat-file -p commit_id" 查看commit 物件的內容:
 
 
 
 

(二)絕對名稱的簡短語法

  • 標示「絕對名稱」時,可以用"前面幾碼"代替,最少不可低於 4 個字元
  •  註: "4 - 40" 個字元長度的「絕對名稱」都可以使用。
 
  • [ 技巧1 ] 透過 "git cat-file -p tree_id" 來取得 tree 物件的內容:
 
  • [ 技巧2 ] 使用 "git log --pretty=oneline" 取得精簡後的 "git log" 紀錄,同時也可取得 commit 物件完整的「絕對名稱」:
 
  • [ 技巧3 ] 使用 "git log --pretty=oneline --abbrev-commit" 取得精簡後的 "git log" 紀錄,和物件部份的「絕對名稱」: