狀態描述
請記住,工作目錄下面的所有文件都不外乎這兩種狀態:已跟蹤或未跟蹤。已跟蹤的文件是指本來就被納入版本控制管理的文件,在上次快照中有它們的記錄,工作一段時間後,它們的狀態可能是未更新,已修改或者已放入暫存區。而所有其他文件都屬於未跟蹤文件。它們既沒有上次更新時的快照,也不在當前的暫存區域。初次克隆某個倉庫時,工作目錄中的所有文件都屬於已跟蹤文件,且狀態為未修改。
在編輯過某些文件之後,Git 將這些文件標為已修改。我們逐步把這些修改過的文件放到暫存區域,直到最後一次性提交所有這些暫存起來的文件,如此重復。
如果此時新添加一個文件,那麼它並不在git監管之下,屬於未追蹤的。使用add可以將文件納入到暫存之下。這時候使用git commit會將暫存之下的修改提交,這個時候即使有修改,但是沒有git add過,那麼commit之後,git也不會存在它的快照。所以,要想將文件修改添加到本地倉庫中,需要先add,然後再commit。當然,這樣有點繁瑣,可以直接使用git commit -a命令將工作目錄中的修改保存到本地倉庫中。
一般我們總會有些文件無需納入 Git 的管理,也不希望它們總出現在未跟蹤文件列表。通常都是些自動生成的文件,比如日志文件,或者編譯過程中創建的臨時文件等。我們可以創建一個名為
.gitignore
的文件,列出要忽略的文件模式。
要查看尚未暫存的文件更新了哪些部分,不加參數直接輸入 git diff。此命令比較的是工作目錄中當前文件和暫存區域快照之間的差異,也就是修改之後還沒有暫存起來的變化內容。若要看已經暫存起來的文件和上次提交時的快照之間的差異,可以用
git diff --cached
命令。(Git 1.6.1 及更高版本還允許使用 git diff --staged
,效果是相同的,但更好記些。)
請注意,單單
git diff
不過是顯示還沒有暫存起來的改動,而不是這次工作和上次提交之間的差異。所以有時候你一下子暫存了所有更新過的文件後,運行
git diff
後卻什麼也沒有,就是這個原因。
文件提交
git commit -m "Story 182: Fix benchmarks for speed"
可以提交暫存的修改。
git commit -a -m 'added new benchmarks'
上面的命令加了a參數,可以將工作目錄中的修改直接提交,等同於跳過了add過程。
移除文件
要從 Git 中移除某個文件,就必須要從已跟蹤文件清單中移除(確切地說,是從暫存區域移除),然後提交。可以用
git rm
命令完成此項工作,並連帶從工作目錄中刪除指定的文件,這樣以後就不會出現在未跟蹤文件清單中了。
如果只是簡單地從工作目錄中手工刪除文件,運行
git status
時就會在 “Changes not staged for commit” 部分(也就是未暫存清單)看到。
然後再運行
git rm
記錄此次移除文件的操作 git rm filename
如果刪除之前修改過並且已經放到暫存區域的話,則必須要用強制刪除選項
-f
(譯注:即 force 的首字母),以防誤刪除文件後丟失修改的內容。
另外一種情況是,我們想把文件從 Git 倉庫中刪除(亦即從暫存區域移除),但仍然希望保留在當前工作目錄中。換句話說,僅是從跟蹤清單中刪除。比如一些大型日志文件或者一堆
.a
編譯文件,不小心納入倉庫後,要移除跟蹤但不刪除文件,以便稍後在 .gitignore
文件中補上,用
--cached
選項即可
git rm --cached readme.txt
移動文件
要在 Git 中對文件改名,可以這麼做:
git mv file_from file_to
其實,運行 git mv
就相當於運行了下面三條命令:mv README.txt README
git rm README.txt
git add README
查看提交歷史
git log
git log
有許多選項可以幫助你搜尋感興趣的提交,接下來我們介紹些最常用的。git log -p -2
我們常用 -p
選項展開顯示每次提交的內容差異,用 -2
則僅顯示最近的兩次更新.某些時候,單詞層面的對比,比行層面的對比,更加容易觀察。Git 提供了 --word-diff
選項。我們可以將其添加到
git log -p
命令的後面,從而獲取單詞層面上的對比。在程序代碼中進行單詞層面的對比常常是沒什麼用的。不過當你需要在書籍、論文這種很大的文本文件上進行對比的時候,這個功能就顯出用武之地了。
新增加的單詞被 {+ +}
括起來,被刪除的單詞被 [- -]
括起來。在進行單詞層面的對比的時候,你可能希望上下文( context )行數從默認的 3 行,減為 1 行,那麼可以使用
-U1
選項。
還有個常用的 --pretty
選項,可以指定使用完全不同於默認格式的方式展示提交歷史。比如用 oneline
將每個提交放在一行顯示,這在提交數很大時非常有用。
以上只是簡單介紹了一些 git log
命令支持的選項。表 2-2 還列出了一些其他常用的選項及其釋義。