今天是Git系列課程第三課,前兩課我們都是在做Git倉庫準備工作,今天痞子衡要講的是如何檢視Git空間內發生的改動。
本地有了倉庫,我們便可以在倉庫所在目錄下做檔案增刪改操作,為了確定改動操作的正確性,我們需要實時檢視這些改動狀態,有兩種檢視方式git status和git diff,痞子衡為大家逐一介紹:
1.檢視Git空間檔案改動狀態git status
前面講過Git空間內檔案改動有4種狀態,除了Unmodified狀態的檔案因為並未改動預設沒有狀態不做顯示之外,其他檔案改動狀態都可以通過git status來檢視。讓我們開始在工作區建立3個檔案:main.c、test.c、dummy.c
dummy.c(路徑:/gittest/app/dummy.c)為空白檔案。
test.c(路徑:/gittest/app/test.c)檔案內容如下:
#include <stdio.h>
#include <stdlib.h>
void test(void)
{
printf("this is test\n");
}
main.c(路徑:/gittest/main.c)檔案內容如下:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("hello world\n");
return 0;
}
為了使改動型別更加豐富一點,我們在已存在Git本地&遠端倉庫的README.md檔案中增加一行內容"# first update"。我們來看看Git記錄的狀態,從下面結果可知,新增的3個檔案在Git空間裡都屬於Untracked檔案,存放在工作區內。READMED.md檔案的改動處於Modified狀態,也存放在工作區。
jay@pc MINGW64 /d/my_project/gittest (master)
$ git statusOn branch master Your branch is up to date with 'origin/master'. Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: README.md Untracked files: (use "git add <file>..." to include in what will be committed) app/ main.c no changes added to commit (use "git add" and/or "git commit -a")
2.檢視Git空間檔案具體改動git diff
git status只能讓我們知道檔案在Git空間內的改動狀態,但如果我們想檢視某個檔案內具體改了什麼(也可以理解為在不同Git空間中的差異),此時需要用git diff命令。
對於main.c檔案,由於是新增的檔案,其只存在於工作區,且處於Untracked狀態,Git認為無論是哪兩個Git空間之間的比對都沒有意義,得到的結果是沒有區別。
而對於README.md檔案,由於已經被提交到倉庫了,處於Git管理中,所以這個檔案同時存在於三個Git空間(工作區,暫存區,倉庫),我們在工作區內對其進行了檔案改動,無論是比對工作區vs暫存區或者工作區vs倉庫,得到的結果應該都是README.md檔案裡的具體變化內容。而如果比對暫存區vs倉庫,得到的結果也應該是沒有區別。
2.1檢視檔案當前變動(工作區vs暫存區)git diff [file path]
// 檢視main.c得不到任何結果
jay@pc MINGW64 /d/my_project/gittest (master)
$ git diff main.c// 檢視README.md可看到檔案具體變化
jay@pc MINGW64 /d/my_project/gittest (master)
$ git diff README.mddiff --git a/README.md b/README.md index 92eca93..229dc5f 100644 --- a/README.md +++ b/README.md @@ -1 +1,2 @@ # gittest +# first update
2.2檢視檔案跨越變動(工作區vs倉庫)git diff [commit] [file path]
由於gittest倉庫目前只有一次提交,所以此處commit只能是HEAD,只能與上一次提交對比,得到的結果與2.1是一致的。為了充分展示這個功能,我們將此次的README.md的改動先提交到倉庫。
jay@pc MINGW64 /d/my_project/gittest (master)
$ git add README.mdjay@pc MINGW64 /d/my_project/gittest (master)
$ git commit -m "second commit"[master aa9db9d] second commit 1 file changed, 1 insertion(+)
jay@pc MINGW64 /d/my_project/gittest (master)
$ git fetchjay@pc MINGW64 /d/my_project/gittest (master)
$ git rebaseFirst, rewinding head to replay your work on top of it... Applying: second commit
jay@pc MINGW64 /d/my_project/gittest (master)
$ git pushCounting objects: 3, done. Writing objects: 100% (3/3), 276 bytes | 276.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0) To github.com:JayHeng/gittest.git 5fe04f8..867df08 master -> master
然後對README.md再修改一次增加新一行內容"# second update"。現在我們再來檢視README.md跨級變動(HEAD表示是最近一次commit,HEAD^表示上一次commit,HEAD~100表示上100次commit):
// 檢視README.md與最近一次commit的變化(等同於當前變化)
jay@pc MINGW64 /d/my_project/gittest (master)
$ git diff HEAD README.mddiff --git a/README.md b/README.md index 229dc5f..db5442d 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ # gittest # first update +# second update
// 檢視README.md與上一次commit的變化(等同於2次變化的彙總)
jay@pc MINGW64 /d/my_project/gittest (master)
$ git diff HEAD^ README.mddiff --git a/README.md b/README.md index 92eca93..db5442d 100644 --- a/README.md +++ b/README.md @@ -1 +1,3 @@ # gittest +# first update +# second update
對於README.md檔案的第二次改動僅是用於演示跨越變動對比的功能,為不影響後續講解,我們現在將這個變動恢復(檔案編輯器開啟檔案,直接刪除"# second update")。
2.3檢視檔案歷史變更(倉庫vs倉庫)git diff [commit] [commit]
gittest倉庫目前已有2次提交,讓我們直接比對這兩次提交。Note:Git每次commit都會產生一個唯一ID(SHA-1號)用於記錄這個commit,可在git commit/git push命令的返回結果裡看到。
jay@pc MINGW64 /d/my_project/gittest (master)
$ git diff 5fe04f8 867df08diff --git a/README.md b/README.md index 92eca93..229dc5f 100644 --- a/README.md +++ b/README.md @@ -1 +1,2 @@ # gittest +# first update