這節(jié)課主要介紹下本地目錄的文件修改后如何添加到暫存區(qū)、提交到 Git 版本庫(kù),以及如何比較文件內(nèi)容差異、如何跳過(guò)添加暫存區(qū)步驟提交等內(nèi)容。大家也發(fā)現(xiàn)了,提交的操作我們前幾節(jié)提到過(guò),當(dāng)時(shí)可能沒(méi)有太多概念,這節(jié)我們就來(lái)個(gè)系統(tǒng)講解,補(bǔ)充強(qiáng)化之前學(xué)過(guò)的內(nèi)容。
工作目錄中的每個(gè)文件都有兩種狀態(tài):已跟蹤或未跟蹤。跟蹤的文件是最后一個(gè)快照中的文件,在此基礎(chǔ)上可以不修改,修改或提交。簡(jiǎn)而言之,已跟蹤文件就是 Git 知道的文件。
而未跟蹤的文件就是工作目錄中不在上一個(gè)快照中且不在暫存區(qū)中的所有文件,也就是說(shuō)這部分內(nèi)容你做了修改,但是還沒(méi)告訴 Git。
第一次克隆存儲(chǔ)庫(kù)時(shí),所有文件都會(huì)被跟蹤,因?yàn)槭菑?Git 上拉取下來(lái)的,Git 當(dāng)然知道。
在編輯文件時(shí),Git 會(huì)將其視為已修改,因?yàn)樽陨洗翁峤灰詠?lái)已對(duì)其進(jìn)行了更改。在工作時(shí),有選擇地暫存這些已修改的文件,然后提交所有已暫存的更改,重復(fù)這個(gè)過(guò)程,就是我們的常規(guī)操作流程。
好了,接下來(lái)就跟著我的步驟進(jìn)行進(jìn)一步的學(xué)習(xí),看下怎么讓 Git 去實(shí)現(xiàn)文件修改提交的每一步。
1. 查看文件狀態(tài)
如果想查看我們的工作目錄下的文件處于已跟蹤還是未跟蹤狀態(tài),也就是說(shuō)我們想看看哪些文件修改了還沒(méi)告訴 Git,或者一些別的信息,比如當(dāng)前所處的分支(分支的知識(shí)后續(xù)會(huì)講)等。就可以用下面的命令:
$ git status
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
可以看到,當(dāng)前所處的分支是 master,并且當(dāng)前工作目錄下沒(méi)有任何要提交的內(nèi)容。也就是說(shuō),目前工作目錄的內(nèi)容與 Git 管理的內(nèi)容一樣。
那么我在當(dāng)前目錄新增一個(gè)文件,并寫(xiě)入一些內(nèi)容之后,我們?cè)倏聪聲?huì)發(fā)生什么。
$ echo 'test status' > test2.txt
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
test2.txt
nothing added to commit but untracked files present (use "git add" to track)
可以看到,已經(jīng)有未跟蹤的內(nèi)容了,就是 Untracked files 那部分信息。因?yàn)槲覀儎倓偛](méi)有添加到暫存區(qū),Git 還不知道。
附:演示流程如下:
2. 將修改添加到暫存區(qū)
上面的操作我們也看到了,當(dāng)新增了一個(gè)文件之后,使用 "git status" 命令查看文件狀態(tài)信息時(shí),最后一行內(nèi)容:nothing added to commit but untracked files present (use “git add” to track)。提示我們沒(méi)有提交任何內(nèi)容但是存在未跟蹤的文件,括號(hào)里面說(shuō)可以使用 “git add” 命令去使其被跟蹤管理。
這個(gè) “git add” 命令就是將新做的修改添加到 git 暫存區(qū)的,那么我們就來(lái)試一下,把上一步新建的文件進(jìn)行添加:
$ git add test2.txt
之后再查看下文件狀態(tài):
$ 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)
new file: test2.tx
此時(shí),文件 test2.txt 就到了 “Changes to be committed” 的內(nèi)容下面,也就是將要被提交的修改,因?yàn)橐呀?jīng)添加到了暫存區(qū),接下來(lái)可以進(jìn)行提交。
直到這里,一切都是那么順滑,不對(duì),順利!
附:演示流程如下:
3. 將暫存區(qū)內(nèi)容提交
接著上一點(diǎn),我們準(zhǔn)備將 test2.txt 進(jìn)行正式提交。
但是,但是,但是,我就不提交(微笑臉)。
直接提交豈不是太簡(jiǎn)單了?現(xiàn)在我在提交之前又反悔了,突然想起來(lái)還想加一句 “hello world”,那就加唄,加完我們?cè)倏纯磿?huì)變成什么鬼樣子。
$ echo 'hello world' >> test2.txt
$ 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)
new file: test2.txt
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: test2.
哎!不對(duì)啊。test2.txt 這個(gè)文件剛剛不是在 “Changes to be committed” 下面嗎?現(xiàn)在怎么同時(shí)又存在于 “Changes not staged for commit” 下面了。這個(gè)文件怎么同時(shí)存在 “已暫存” 和 “未暫存” 兩種狀態(tài)了?
附:這部分演示流程如下:
別急,跟我往下繼續(xù)看!那要不我們先執(zhí)行下提交看看會(huì)變成什么狀態(tài)?好!說(shuō)干就干!對(duì)了,忘了說(shuō)了,提交命令是 “git commit -m ‘這是提交說(shuō)明’”,hiahia~~~
$ git commit -m 'commit 1'
[master bba6ffb] commit 1
1 file changed, 1 insertion(+)
create mode 100644 test2.txt
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: test2.txt
no changes added to commit (use "git add" and/or "git commit -a")
仔細(xì)看:我在執(zhí)行 "git commit" 之后,提示 test2.txt 已提交。但是我執(zhí)行 “git status” 之后,卻發(fā)現(xiàn)在 “Changes not staged for commit” 部分還存在一個(gè) test2.txt,這是為啥?
其實(shí),提交后只把前面步驟中執(zhí)行了 “git add” 那部分修改進(jìn)行了提交,而后面我再追加的 “hello world” 的內(nèi)容由于沒(méi)有執(zhí)行 “git add”,并沒(méi)有納入 git 的暫存區(qū),提交也就自然提交不了。那想要再提交這部分內(nèi)容怎么辦?簡(jiǎn)單啊!繼續(xù)執(zhí)行 “git add”,“git commit” 就好了。
$ git add test2.txt
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: test2.txt
$ git commit -m 'commit 2'
[master 446c174] commit 2
1 file changed, 1 insertion(+)
$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
看,現(xiàn)在狀態(tài)正常了。是不是一切都是那么熟悉?就像初戀般的感覺(jué)。
附:這部分演示流程如下:
通過(guò)這個(gè)過(guò)程,我們可以看到,“git commit” 只把暫存區(qū)的修改提交了,也就是第一次執(zhí)行了 “git add” 的修改被提交了,第二次的修改不會(huì)被提交。
4. 比較工作區(qū)和版本庫(kù)的文件差異
前面步驟我們操作了修改文件后如何去添加到暫存區(qū)、提交版本庫(kù)等流程,那么如果我們提交后又在本地做了修改,怎么比較版本庫(kù)和本地工作區(qū)的差異呢?自然也是有辦法的,執(zhí)行如下命令就可以了:
$ git diff HEAD -- test.txt
我們?cè)囍谔峤话姹編?kù)后又做一些修改,比如我追加一行內(nèi)容,再看下與版本庫(kù)的差異,演示流程如下:
5. 跳過(guò)暫存區(qū)直接提交
我們知道,如果對(duì)一個(gè)文件做了修改,想要提交至版本庫(kù)之前必須先加入暫存區(qū)。但是,git 提供了一個(gè)偷懶的辦法(畢竟,程序員效率至上嘛),就是可以跳過(guò)暫存區(qū)提交,使用如下命令:
$ git commit -a -m '備注'
演示流程如下:
注意:“git commit -a -m” 這個(gè)命令必須在文件內(nèi)容修改后使用,如果你的文件是剛新建的并且還沒(méi)提交過(guò),那么還是需要先 “git add”。
正常的開(kāi)發(fā)過(guò)程中,對(duì)于提交日志的規(guī)范都有要求。日志是我們作為歷史版本維護(hù)的一個(gè)很重要的內(nèi)容,一個(gè)好的日志模板可以方便進(jìn)行代碼 review,以及后續(xù)開(kāi)發(fā)者快速了解歷史問(wèn)題等等。本教程只是演示,實(shí)際開(kāi)發(fā)中請(qǐng)遵守具體規(guī)范!
6. 總結(jié)
溫故而知新,我們先走起。本節(jié)課內(nèi)容總結(jié)如下:
- 查看文件狀態(tài):git status
- 將修改添加到暫存區(qū):git add 文件名
- 將暫存區(qū)內(nèi)容提交:git commit -m ‘描述’
- 比較工作區(qū)和版本庫(kù)的文件差異:git diff HEAD – 文件名
- 跳過(guò)暫存區(qū)直接提交:git commit -a
好了,今天的內(nèi)容我們就講到這里,希望大家多加練習(xí),早日 get 到 git 的精髓!