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