git-diff - Show changes between commits, commit and working tree, etc
git diff 顯示提交與提交之間、提交與工作樹之間的文件修改。
- git diff 顯示本地開發工作中已經修改但未提交至暫存區的文件和已經提交至暫存區文件的修改
- git diff HEAD 顯示的是已提交到工作樹中文件和未提交到工作樹中文件的所有修改。查看已緩存的與未緩存的所有改動。
- git diff --cached 上一次最后一次提交到工作樹中文件(也就是head)與暫存區內文件的改動。查看已緩存的改動。
總結一下,可以想象有三個環境,一個是我們本地正在編輯的開發環境,一個我們提交的版本庫環境,還有中間一個暫時存放代碼的暫存區。
git diff 就是我們本地正在開發的但未提交到暫存區文件和之前已經提交到暫存區里的文件的對比;
git diff head 就是已經提交到版本庫環境中的文件和未提交到版本庫環境中文件的所有修改對比;
git diff --cached 最后一次提交到版本庫環境中文件和暫存區中文件的修改對比;
具體可以看下面例子:
- 顯示本地開發工作中已經修改但未提交至暫存區的文件和已經提交至暫存區文件的修改
未使用過git add命令,使用git diff沒有任何文件修改會顯示。
使用一次git add命令,再修改文件,再使用git diff顯示本地開發工作中已經修改但未提交至暫存區的文件和已經提交至暫存區文件的修改!
例如:在D盤中新建文件夾test,在test文件夾中 git init demo 初始化一個版本,在demo中新建一個a.txt文件,a.txt中輸入數字 1
此時使用git diff不會出現任何文件修改信息,因為現在暫存區、提交版本庫中都沒有任何文件。
使用git add . 將a.txt 添加到暫存區中,此時 使用 git diff 命令,也不會出現任何修改信息,因為此時暫存區內文件和本地開發文件是一樣的。
再次修改 a.txt,在a.txt中添加2,再使用 git diff命令
這次git diff顯示的就是文件a.txt和暫存區(就是剛才add到暫存區里只有數字 1 的a.txt 的文件的修改)。
- 查看已緩存的與未緩存的所有改動:git diff HEAD 顯示的是已提交到工作樹中文件和未提交到工作樹中文件的所有修改。
1、當沒有對demo版本庫執行過git commit命令時,執行git diff head會報警告,警告翻譯放到下面了,記下我自己的理解,因為head是指向當前版本庫中master的,因為在此之前沒有執行過提交命令,所以版本庫中是空的,所以找不到目前的工作樹。
warning: ignoring dangling symref head
警告:忽略懸掛的symref頭
fatal: ambiguous argument 'head': unknown revision or path not in the working tree.
不明確的參數'head':未知的修訂或路徑不在工作樹中。
Use '--' to separate paths from revisions, like this: 'git <command> [<revision>...] -- [<file>...]'
使用“——”將路徑與修訂分開,如下所示:
“git命令> < <修改>…)——(<文件>…)”
2、執行git commit命令,將上面的a.txt提交到工作樹中,再執行git diff head依舊無任何修改區別顯示。
3、修改下 a.txt文件,在a.txt中添加 3 ,再次執行 git diff head
4、執行git add將 a.txt 添加到暫存區,再次執行 git diff head。此時執行git diff head返回的結果和沒有add之前的結果是一樣的。
5、再次修改a.txt,在a.txt中加入4。執行git diff head,執行git diff,進行對比。因為上面第4步中我再次將a.txt添加到暫存區里去了,所以暫存區里的a.txt是包含3的,再一次說明了git diff顯示的是本地開發工作中已經修改但未提交至暫存區的文件和已經提交至暫存區文件的修改。git diff head 顯示的是已提交到工作樹中文件和未提交到工作樹中文件的所有修改。
- 查看已緩存的改動。工作樹中文件head與暫存區內文件的改動。
直接接着上面的步驟執行 git diff --cached
本地a.txt包含1,2,3,4。暫存區中文件包括1,2,3。已經提交的工作樹中包括1,2。