Git實用教程7:版本比較(各種內容相互比較)

本節主要知識點:


比較暫存區域與工作目錄

直接執行 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 文件的內容:
在這裏插入圖片描述
目前我們的 Git 倉庫應該是醬紫:
如果希望比較第一份快照(ed3708c)和當前目錄的內容,輸入 git diff ed3708c 命令即可:
在這裏插入圖片描述
如果希望比較最新提交的快照和當前目錄的內容,輸入 git diff HEAD 命令即可:
在這裏插入圖片描述

比較暫存區域和 Git 倉庫快照


在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
另外window可能會遇到中文出現亂碼的情況,可以嘗試更改 文件編碼爲 UTF-8 無BOM 模式

我嘗試過這種 ,但是就我的機子不能實現 ,後來查詢了許多博客以後發現是自己的 cmd 的 原因,所以將自己的cmd 的屬性改了一下,因爲是前天弄的,今天才攢夠魚幣 ,所以找不到鏈接了 ,見諒。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章