本節主要知識點:
比較暫存區域與工作目錄
直接執行
git diff
命令是比較暫存區域與工作目錄的文件內容:
比較兩個歷史快照
執行
git diff 第一個歷史快照的ID 第二個歷史快照的ID
命令,
比較當前工作目錄和 Git 倉庫中的快照
比較第一份快照(ed3708c)和當前目錄的內容,輸入
git diff 第一份快照ID
命令,
比較最新提交的快照和當前目錄的內容,輸入git diff HEAD
命令即可:
比較暫存區域和 Git 倉庫快照
比較最新提交的快照和暫存區域的文件,只需要執行
git diff --cached
命令,
這一講教給大家一個灰常重要的命令,看我真誠的小眼神 (づ。◕‿‿◕。)づ
status 命令雖然可以查看到當前的工作狀態,也有 Git 給你提供友情提示,但它只會告訴你版本發生了改變(哪個文件有變化,增加、減少了多少行),但它沒法告訴你版本之間到底有哪些不同。而我們缺的,正正就是這個功能!!
(⊙v⊙)嗯,缺啥來啥,誰讓小甲魚是你們的心腹呢~~
今天我們要講的命令叫 diff,就是 different 的縮寫,這個命令是專門用來找茬的。
爲了讓大家學得實打實,小甲魚決定重新建立一個項目,大家 Follow me!
準備工作
Step One:
創建一個叫做 MyProject2 的新文件夾作爲本次演示的項目,初始化 Git(方法跟 Git實用教程4:實戰 一致,忘了的童鞋請回滾教程……)。
Step Two:
現在模擬我們在完成《零基礎入門學習Python》的一道課後作業題……
創建一個 game.py 的文本,將下邊代碼拷貝進去:
import random
print('------------------我愛魚C工作室------------------')
secret = random.randint(1,10)
temp = input("不妨猜一下小甲魚現在心裏想的是哪個數字:")
guess = int(temp)
while guess != secret:
temp = input("哎呀,猜錯了,請重新輸入吧:")
guess = int(temp)
if guess == secret:
print("臥槽,你是小甲魚心裏的蛔蟲嗎?!")
print("哼,猜中了也沒有獎勵!")
else:
if guess > secret:
print("大了,大了~~~")
else:
print("小了,小了~~~")
print("遊戲結束,不玩啦^_^")
再創建一個 README.md 文件,寫清楚這是一個課後作業的項目:
Step Three:
執行 git add README.md game.py
命令將文件添加到暫存區域,接着執行 git commit -m “猜數字遊戲” 提交項目的第一個快照(你不知道嗎?Git 一直都是支持中文的呀 ):
Step Four:
接着我們按照課後作業的要求改寫代碼如下:
import random
print('------------------我愛魚C工作室------------------')
times = 3
secret = random.randint(1,10)
guess = 0
print("不妨猜一下小甲魚現在心裏想的是哪個數字:", end=" ")
while (guess != secret) and (times > 0):
temp = input()
guess = int(temp)
times = times - 1 # 用戶每輸入一次,可用機會就-1
if guess == secret:
print("哇哦,你是小甲魚心裏的蛔蟲嗎?!")
print("哼,猜中了也沒有獎勵!")
else:
if guess > secret:
print("哥,大了大了~~~")
else:
print("嘿,小了,小了~~~")
if times > 0:
print("再試一次吧:", end=" ")
else:
print("機會用光咯T_T")
print("遊戲結束,不玩啦^_^")
README.md 文件也改一改:
比較暫存區域與工作目錄
直接執行 git diff
命令是比較暫存區域與工作目錄的文件內容:
不急,我一個個給你解釋……
首先,diff 命令是 linux 上非常重要的工具,用於比較文件的內容,特別是比較兩個版本不同的文件以找到改動的地方。diff 程序的輸出被稱爲補丁 (patch),因爲 Linux 系統中還有一個 patch 程序,可以根據 diff 的輸出將 a.c 的文件內容更新爲 b.c。
diff 現在已經是 Git 不可或缺的一部分了!值得一提的是,現在的 diff 已經可以很好的支持二進制文件了,比如 docx 文件以前不支持,現在都支持啦(≧▽≦)/
第一行:diff --git a/README.md b/README.md
表示對比的是存放在暫存區域的 README.md 和工作目錄的 README.md
第二行:index 7966837..472a180 100644
表示對應文件的 ID 分別是 7966837 和 472a180,左邊暫存區域,後邊當前目錄。
最後的 100644 是指定文件的類型和權限。喏,具體的定義我也幫你找出來了(Linux 系統的定義,看不懂沒關係,我知道有人需要,所以順便貼出來):
The following flags are defined for the st_mode field:
S_IFMT 0170000 bit mask for the file type bit fields
S_IFSOCK 0140000 socket
S_IFLNK 0120000 symbolic link
S_IFREG 0100000 regular file
S_IFBLK 0060000 block device
S_IFDIR 0040000 directory
S_IFCHR 0020000 character device
S_IFIFO 0010000 FIFO
S_ISUID 0004000 set UID bit
S_ISGID 0002000 set-group-ID bit (see below)
S_ISVTX 0001000 sticky bit (see below)
S_IRWXU 00700 mask for file owner permissions
S_IRUSR 00400 owner has read permission
S_IWUSR 00200 owner has write permission
S_IXUSR 00100 owner has execute permission
S_IRWXG 00070 mask for group permissions
S_IRGRP 00040 group has read permission
S_IWGRP 00020 group has write permission
S_IXGRP 00010 group has execute permission
S_IRWXO 00007 mask for permissions for others (not in group)
S_IROTH 00004 others have read permission
S_IWOTH 00002 others have write permission
S_IXOTH 00001 others have execute permission
第三行:--- a/README.md
— 表示該文件是舊文件(存放在暫存區域)
第四行:+++ b/README.md
+++ 表示該文件是新文件(存放在工作區域)
第五行:@@ -1 +1,2 @@
以 @@ 開頭和結束,中間的“-”表示舊文件,“+”表示新文件,後邊的數字表示“開始行號,顯示行數”
不要緊,先看接着的六、七行的內容:
這是將兩個文件合併顯示的結果,前邊有個 + 的綠色的那一行說明是新文件獨有的,淺灰色的則是兩個文件所共有的內容。
所以,+1,2 表示新文件在合併顯示中從第 1 行開始,顯示 2 行。
那爲啥 -1 後邊沒有顯示的行數?
因爲在合併顯示的結果中,舊文件已經完全包含在新文件中了(也就是舊文件沒有自己“獨有的”內容)。
第八行:\ No newline at end of file
這是 Git 出於善意的提醒:文件不是以換行符結束。
爲什麼會有這樣多此一舉的提醒呢?
仔細推敲下你就會明白了:diff 將兩個文件合併打印,到達最後一個字符的時候,無論文件中是否存在換行符,diff 都需要打印一個換行符!爲啥?爲了好看唄!!所以如果你的文件最後一個字符不是以換行符結尾,但 diff 又自行添加了一個換行符,所以它覺得有義務提醒你它這麼做了!
TIPS:最後空一行是一個良好的編程習慣
再下邊就是另外兩個文件(game.py)的比較了,理解的方式跟上邊一樣。
兩個 @@ 之間表示下方合併顯示的範圍,@@ -1,20 +1,28 @@
表示舊文件從第 1 行開始,顯示 20 行;新文件從第 1 行開始,顯示 28 行。
不信你可以數數看:1,2,3,4,5,6
咦……
這個點點(:)是什麼鬼?
意思是世界太大,窗口太小,沒法全部顯示,正在等待你的命令……
移動命令
這時候你可以輸入下邊的移動命令:
按下 j 按鍵表示向下移動一行,按下 k 按鍵則是向上移動一行。當然你也可以使用上、下方向鍵,但小甲魚不建議你這麼做,因爲按方向鍵意味着你的右手需要離開主鍵盤區……這一來一回很消耗時間和節奏的(論 Vim or Emacs 習慣的重要性 )!
怎麼?嫌移動的速度太慢?
好,試試 f 和 b 兩個按鍵!
f 表示向下一頁(一個窗口的內容);b 表示向上一頁的移動。
一頁又太多了?半頁可否?
可以!d 表示向下移動半頁;u 表示向上移動半頁。
跳轉命令
是否可以直接跳轉到開頭和結尾呢?
可以,按 g 去到第一行,按 G 去到最後一行。
不這麼極端行不行?
可以,先輸入數字 3,再按下 g,表示去到第 3 行。
搜索命令
比如想看下關於 print 函數的內容有沒有變動,可以使用搜索命令。
輸入斜槓(/)或問號(?),後邊輸入搜索的關鍵字:
按下回車,所有匹配的關鍵字均高亮顯示:
然後斜槓(/)和問號(?)的區別主要是搜索方向的不同:斜槓(/)表示從當前位置向下搜索,問號(?)表示從當前位置向上搜索。
接着輸入 n 表示順着當前的搜索方向快速跳轉到下個匹配的位置,大寫的 N 則是與當前搜索方向相反。
退出和幫助
在點點(:)後邊輸入 q,表示退出 diff;輸入 h 表示進入幫助界面,你會看到很多命令和功能(當然都是鳥文),輸入 q 可以退出幫助界面。
其實習慣於 Linux 終端界面的魚油們一定對這些並不陌生……
這些命令也好,操作也罷,都是赤裸裸的文化入侵哈(讓你們用 Windows,剛開始肯定無比蛋疼,但習慣 Linux 的大牛們不知道用得多歡快)~~~
比較兩個歷史快照
Git 倉庫中存放一個個提交的快照,我們能不能對比其中的任意兩個呢?
當然可以!
我們執行 git commit -am "添加功能:玩家只有三次機會"
命令,添加並提交工作目錄中的所有文件:
執行 git log 命令,可以看到現在 Git 倉庫中已經有兩個快照了:
執行 git diff 6e26975 ed3708c
命令,即可比較 Git 倉庫中兩個快照的差異:
比較當前工作目錄和 Git 倉庫中的快照
現在我們稍微改動一下 README.md 文件的內容:
如果希望比較第一份快照(ed3708c)和當前目錄的內容,輸入 git diff ed3708c
命令即可:
如果希望比較最新提交的快照和當前目錄的內容,輸入 git diff HEAD 命令即可:
比較暫存區域和 Git 倉庫快照
另外window可能會遇到中文出現亂碼的情況,可以嘗試更改 文件編碼爲 UTF-8 無BOM 模式
我嘗試過這種 ,但是就我的機子不能實現 ,後來查詢了許多博客以後發現是自己的 cmd 的 原因,所以將自己的cmd 的屬性改了一下,因爲是前天弄的,今天才攢夠魚幣 ,所以找不到鏈接了 ,見諒。