記錄每次更新到倉庫
工作目錄下的每一個文件都不外乎這兩種狀態:已跟蹤 或 未跟蹤。
已跟蹤包括:已提交(committed)、已修改(modified) 和 已暫存(staged)
檢查當前文件狀態
可以用 git status 命令查看哪些文件處于什么狀態。如果在克隆倉庫后立即使用此命令,會看到類似這樣的輸出:
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
這說明你現在的工作目錄相當干凈。換句話說,所有已跟蹤文件在上次提交后都未被更改過。
此外,上面的信息還表明,當前目錄下沒有出現任何處于未跟蹤狀態的新文件,否則 Git 會在這里列出來。
最后,該命令還顯示了當前所在分支,并告訴你這個分支同遠程服務器上對應的分支沒有偏離。現在,分支名是“master”,這是默認的分支名。
跟蹤新文件
使用命令 git add 開始跟蹤一個文件。比如 README
$ git add README
忽略文件
我們有些文件無需納入 Git 的管理,也不希望它們總出現在未跟蹤文件列表。我們可以創建一個名為 .gitignore 的文件,列出要忽略的文件的模式。
實際的 .gitignore 例子:
$ cat .gitignore
*.[oa]
*~
第一行告訴 Git 忽略所有以 .o 或 .a 結尾的文件。一般這類對象文件和存檔文件都是編譯過程中出現的。第二行告訴 Git 忽略所有名字以波浪符(~)結尾的文件,許多文本編輯軟件(比如 Emacs)都用這樣的文件名保存副本。此外,你可能還需要忽略 log,tmp 或者 pid 目錄,以及自動生成的文檔等等。要養成一開始就為你的新倉庫設置好 .gitignore 文件的習慣,以免將來誤提交這類無用的文件。
文件 .gitignore 的格式規范如下:
- 所有空行或者以 # 開頭的行都會被 Git 忽略。
- 可以使用標準的 glob 模式匹配,它會遞歸地應用在整個工作區中。
- 匹配模式可以以(/)開頭防止遞歸。
- 匹配模式可以以(/)結尾指定目錄。
- 要忽略指定模式以外的文件或目錄,可以在模式前加上嘆號(!)取反。
所謂的 glob 模式是指 shell 所使用的簡化了的正則表達式。星號(*)匹配零個或多個任意字符;[abc] 匹配任何一個列在方括號中的字符 (這個例子要么匹配一個 a,要么匹配一個 b,要么匹配一個 c);問號(?)只匹配一個任意字符;如果在方括號中使用短劃線分隔兩個字符, 表示所有在這兩個字符范圍內的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的數字)。使用兩個星號( )表示匹配任意中間目錄,比如 a/ /z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等。
再看一個 .gitignore 文件的例子:
# 忽略所有的 .a 文件
*.a
# 但跟蹤所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a
# 只忽略當前目錄下的 TODO 文件,而不忽略 subdir/TODO
/TODO
# 忽略任何目錄下名為 build 的文件夾
build/
# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目錄及其所有子目錄下的 .pdf 文件
doc/**/*.pdf
查看已暫存和未暫存的修改
如果 git status 命令的輸出對于你來說過于簡略,而你想知道具體修改了什么地方,可以用 git diff 命令。
此命令比較的是工作目錄中當前文件和暫存區域快照之間的差異。也就是修改之后還沒有暫存起來的變化內容。
若要查看已暫存的將要添加到下次提交里的內容,可以用 git diff --staged 命令。這條命令將比對已暫存文件與最后一次提交的文件差異。
提交更新
現在的暫存區已經準備就緒,可以提交了。在此之前,請務必確認還有什么已修改或新建的文件還沒有 git add 過, 否則提交的時候不會記錄這些尚未暫存的變化。這些已修改但未暫存的文件只會保留在本地磁盤。所以,每次準備提交前,先用 git status 看下,你所需要的文件是不是都已暫存起來了, 然后再運行提交命令 git commit:
$ git commit
這樣會啟動你選擇的文本編輯器來輸入提交說明。
也可以在 commit 命令后添加 -m 選項,將提交信息與命令放在同一行,如下所示:
$ git commit -m "Story 182: Fix benchmarks for speed"
[master 463dc4f] Story 182: Fix benchmarks for speed
2 files changed, 2 insertions(+)
create mode 100644 README
可以看到,提交后它會告訴你,當前是在哪個分支(master)提交的,本次提交的完整 SHA-1 校驗和是什么(463dc4f),以及在本次提交中,有多少文件修訂過,多少行添加和刪改過。
跳過使用暫存區域
盡管使用暫存區域的方式可以精心準備要提交的細節,但有時候這么做略顯繁瑣。Git 提供了一個跳過使用暫存區域的方式, 只要在提交的時候,給 git commit 加上 -a 選項,Git 就會自動把所有已經跟蹤過的文件暫存起來一并提交,從而跳過 git add 步驟。
這很方便,但是要小心,有時這個選項會將不需要的文件添加到提交中。
移除文件
要從 Git 中移除某個文件,就必須要從已跟蹤文件清單中移除(從暫存區域移除),然后提交??梢杂?git rm 命令完成此項工作,并連帶從工作目錄中刪除指定的文件,這樣以后就不會出現在未跟蹤文件清單中了。
如果要刪除之前修改過或已經放到暫存區的文件,則必須使用強制刪除選項 -f(force 首字母)。
另外一種情況是,我們想把文件從 Git 倉庫中刪除(亦即從暫存區域移除),但仍然希望保留在當前工作目錄中。換句話說,你想讓文件保留在磁盤,但是并不想讓 Git 繼續跟蹤。當你忘記添加 .gitignore 文件,不小心把一個很大的日志文件或一堆 .a 這樣的編譯生成文件添加到暫存區時,這一做法尤其有用。為達到這一目的,使用 --cached 選項:
$ git rm --cached README
git rm 命令后面可以列出文件或者目錄的名字,也可以使用 glob 模式。比如:
$ git rm log/*.log
注意到星號 * 之前的反斜杠 , 因為 Git 有它自己的文件模式擴展匹配方式,所以我們不用 shell 來幫忙展開。此命令刪除 log/ 目錄下擴展名為 .log 的所有文件。類似的比如:
$ git rm *~
該命令會刪除所有名字以 ~ 結尾的文件。
移動文件
不像其它的 VCS 系統,Git 并不顯式跟蹤文件移動操作。如果在 Git 中重命名了某個文件,倉庫中存儲的元數據并不會體現出這是一次改名操作。不過 Git 非常聰明,它會推斷出究竟發生了什么。
要在 Git 中對文件改名,可以這么做:
$ git mv file_from file_to
此時查看狀態信息,也會明白無誤地看到關于重命名操作的說明:
$ git mv README.md README
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD < file >..." to unstage)
renamed: README.md - > README
其實,運行 git mv 就相當于運行了下面三條命令:
$ mv README.md README
$ git rm README.md
$ git add README
如此分開操作,Git 也會意識到這是一次重命名,所以不管何種方式結果都一樣。兩者唯一的區別在于,git mv 是一條命令而非三條命令,直接使用 git mv 方便得多。不過在使用其他工具重命名文件時,記得在提交前 git rm 刪除舊文件名,再 git add 添加新文件名。
-
文件
+關注
關注
1文章
569瀏覽量
24769 -
Git
+關注
關注
0文章
201瀏覽量
15786
發布評論請先 登錄
相關推薦
評論