Git檢視版本改動—— git diff
HEAD 表示當前版本,也就是最新的提交。上一個版本就是HEAD^,上上一個版本就是
HEAD^^ ,
往上100個版本寫100個 “ ^ ” 比較容易數不過來,所以寫成 HEAD~100 。HEAD~2 相當於 HEAD^^ 。
我們在 Git 版本回退裡 可以利用 HEAD 關鍵字進行指定版本的回退。
那麼對於 $ git diff HEAD -- <filename> 命令是不是也能操作不同的情況?
自己試了試一個例子:
命令 $ git diff 檢視對比兩次檔案內容具體修改了什麼。
命令 $ git diff HEAD -- <filename> (“--”前後有空格),可以檢視
- 第一步:在Git裡新增test.txt。最初內容是數字“1”。並commit 提交到版本庫裡。
- 第二步:增加數字“2”,並提交。
- 第三步:增加數字“3”,並提交。
- 第四步:增加數字“4”,並提交。
- 第五步:增加數字“5”,並提交。
最後檔案內容為:
假設倉庫裡已提交的有五個版本,依次提交的是A、B、C、D、E 。
- 在都已提交的版本庫中:
執行 $ git diff <filename> 命令,命令列視窗不會輸出檔案的改動資訊。
執行 $ git diff HEAD -- <filename> 命令同樣也不會輸出檔案的改動資訊。因為當前工作區未做改動。
執行 $ git diff HEAD^ -- <filename> 命令則可以檢視最近兩次提交版本的區別(版本E和版本D的差別——增加數字“5”)
執行 $ git diff HEAD^^ -- <filename> 命令則可以檢視最近一次提交和最近一次提交的上上個版本的區別(版本E和版本C的差別——增加數字“4”和“5”)
執行 $ git diff HEAD^^^ -- <filename> 命令則可以檢視版本E和版本B的差別——增加數字“3”,“4”和“5”。
執行 $ git diff HEAD~4 -- <filename> 命令則可以檢視版本E和版本A的差別——增加數字“2”,“3”,“4”和“5”。等同於HEAD^^^^
現在增加第六步:再增加數字“6”。分三種情況,還未執行 add、add 後還未commit、add 並commit(版本F)。
在工作區做新的改動後,還未提交:
- 第一種情況:修改檔案內容後還未執行 add 命令
此時執行 $ git diff <filename> 命令,可以檢視對比最近一次提交的版本,剛剛在工作區修改了什麼內容(工作區和版本E的差別——增加數字“6”)。
同樣執行 $ git diff HEAD -- <filename> 命令,也可以檢視對比最近一次提交的版本,剛剛工作區修改了什麼內容——增加數字“6”。
如果執行 $ git diff HEAD^ -- <filename> 則會顯示工作區與倉庫裡最近一次提交的上一次提交的版本的改動資訊(工作區和版本D的差別——增加數字“5”和“6”)。
如果執行 $ git diff HEAD^^ -- <filename> 則會顯示工作區與倉庫裡最近一次提交的上兩次提交的版本的改動資訊(工作區和版本C的差別——增加數字“4”,“5”和“6”)。
依次類推。。
- 第二種情況:修改檔案內容後繼續執行了 add 命令
此時執行 $ git diff <filename> 命令。命令列視窗不會輸出檔案的改動資訊。
而執行 $ git diff HEAD -- <filename> 命令則可以查到工作區與最近一次提交的版本庫裡面的區別(工作區和版本E的差別——增加數字“6”)。
以此類推。。
- 第三種情況:修改檔案內容後繼續執行了 add 命令後,並把檔案commit 到倉庫
此時執行$ git diff <filename> 命令和 $ git diff HEAD -- <filename> 命令,視窗都不會輸出檔案的改動資訊。
而執行 $ git diff HEAD^ -- <filename> 命令則可以檢視最近兩次提交版本的區別,以此類推。即該情況同上述在都已提交的情況下相同,不做贅述。
總結: 對於 $ git diff <filename> 、$ git diff HEAD -- <filename> 、 $ git diff HEAD^ -- <filename> (包括HEAD^^、HEAD^^^、以及以此類推 HAED~number)這三種命令,
在都已提交的版本庫中。如果想檢視其中兩個提交都修改了哪些內容。可以使用 $ git diff HEAD^ -- <filename> 命令開始檢視。以此類推。(即從 HEAD^ 開始便可以了,)
在工作區改動後,還未執行add命令的時候,命令 $
git diff <filename> 和 命令 $
git diff HEAD -- <filename> 兩個都可以檢視當前工作區和最近一次提交的版本之間的差別。以此類推 HEAD^^、HEAD^^^
等可以檢視當前工作區與之前指定某版本的差別。所以當我們在工作區修改過還沒有新增都暫緩區的時候可以用這些命令檢視剛剛在工作區改動了哪裡。
而工作區改動後並且 執行add 命令後但還未提交, $ git diff <filename> 將不能再進行比較。但可以繼續用關鍵詞HEAD、HEAD^ 等進行比較。以此類推。