前言
當對項目做了更改時,我們通常需要知道具體改了哪些文件,哪些文件更改了沒有暫存,哪些文件改了並且已加入到暫存區等待下次commit。上述任務使用git status都可以幫我們解決。但是想要知道文件內部改了哪些地方git status就無能為力了。git status最多只告訴你改沒改,改哪了不知道。git diff可以解決這個問題。
git status
git status 命令的輸出十分詳細,但其用語有些繁瑣。 如果你使用 git status -s 命令或 git status --short 命令,你將得到一種更為緊湊的格式輸出。 運行 git status -s ,狀態報告輸出如下:
$ git status -s M README MM Rakefile A lib/git.rb M lib/simplegit.rb ?? LICENSE.txt
右側M:該文件被修改了但是還沒放入暫存區
左側M:該文件被修改了且放入暫存區
MM:在工作區被修改並提交到暫存區后又在工作區中被修改了,所以在暫存區和工作區都有該文件被修改了的記錄。
A:新添加到暫存區中的文件
??:新添加的未跟蹤文件
X Y Meaning ------------------------------------------------- [MD] not updated M [ MD] updated in index A [ MD] added to index D [ M] deleted from index R [ MD] renamed in index C [ MD] copied in index [MARC] index and work tree matches [ MARC] M work tree changed since index [ MARC] D deleted in work tree ------------------------------------------------- D D unmerged, both deleted A U unmerged, added by us U D unmerged, deleted by them U A unmerged, added by them D U unmerged, deleted by us A A unmerged, both added U U unmerged, both modified ------------------------------------------------- ? ? untracked -------------------------------------------------
git diff
不加參數直接輸入 git diff
工作目錄里面的文件 與 staging area里面的文件做對比。既然staging area里面有這個文件,那么他一定是tracked的。
git diff 本身只顯示尚未暫存的改動,而不是自上次提交以來所做的所有改動。 假設這樣一種場景,你clone了一個項目,改了100個文件,然后git add把他們加到暫存區。然后你git diff,會什么也看不到。因為此時staging area有100個文件,但是你工作目錄並沒有再次修改那100個文件。
退一步講,你clone了一個項目,改了100個文件。這時候你如果不git add,直接git diff則是可以看到輸出的。這時候staging area里面的內容默認是上次cmooit分支的內容。
git diff --cached
Git 1.6.1 及更高版本還允許使用 git diff --staged,效果是相同的,但更好記些。
如果你把修改文件加到staging area,准備commit。在commit之前,想看看我這次提交的內容和上個commit有啥差異,可以執行這個命令。