這節(jié)課主要介紹下本地目錄的文件修改后如何添加到暫存區(qū)、提交到 Git 版本庫,以及如何比較文件內(nèi)容差異、如何跳過添加暫存區(qū)步驟提交等內(nèi)容。大家也發(fā)現(xiàn)了,提交的操作我們前幾節(jié)提到過,當(dāng)時可能沒有太多概念,這節(jié)我們就來個系統(tǒng)講解,補充強化之前學(xué)過的內(nèi)容。
工作目錄中的每個文件都有兩種狀態(tài):已跟蹤或未跟蹤。跟蹤的文件是最后一個快照中的文件,在此基礎(chǔ)上可以不修改,修改或提交。簡而言之,已跟蹤文件就是 Git 知道的文件。
而未跟蹤的文件就是工作目錄中不在上一個快照中且不在暫存區(qū)中的所有文件,也就是說這部分內(nèi)容你做了修改,但是還沒告訴 Git。
第一次克隆存儲庫時,所有文件都會被跟蹤,因為是從 Git 上拉取下來的,Git 當(dāng)然知道。
在編輯文件時,Git 會將其視為已修改,因為自上次提交以來已對其進行了更改。在工作時,有選擇地暫存這些已修改的文件,然后提交所有已暫存的更改,重復(fù)這個過程,就是我們的常規(guī)操作流程。
好了,接下來就跟著我的步驟進行進一步的學(xué)習(xí),看下怎么讓 Git 去實現(xiàn)文件修改提交的每一步。
1. 查看文件狀態(tài)
如果想查看我們的工作目錄下的文件處于已跟蹤還是未跟蹤狀態(tài),也就是說我們想看看哪些文件修改了還沒告訴 Git,或者一些別的信息,比如當(dāng)前所處的分支(分支的知識后續(xù)會講)等。就可以用下面的命令:
$ 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)前工作目錄下沒有任何要提交的內(nèi)容。也就是說,目前工作目錄的內(nèi)容與 Git 管理的內(nèi)容一樣。
那么我在當(dāng)前目錄新增一個文件,并寫入一些內(nèi)容之后,我們再看下會發(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 那部分信息。因為我們剛剛并沒有添加到暫存區(qū),Git 還不知道。
附:演示流程如下:
2. 將修改添加到暫存區(qū)
上面的操作我們也看到了,當(dāng)新增了一個文件之后,使用 "git status" 命令查看文件狀態(tài)信息時,最后一行內(nèi)容:nothing added to commit but untracked files present (use “git add” to track)。提示我們沒有提交任何內(nèi)容但是存在未跟蹤的文件,括號里面說可以使用 “git add” 命令去使其被跟蹤管理。
這個 “git add” 命令就是將新做的修改添加到 git 暫存區(qū)的,那么我們就來試一下,把上一步新建的文件進行添加:
$ 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
此時,文件 test2.txt 就到了 “Changes to be committed” 的內(nèi)容下面,也就是將要被提交的修改,因為已經(jīng)添加到了暫存區(qū),接下來可以進行提交。
直到這里,一切都是那么順滑,不對,順利!
附:演示流程如下:
3. 將暫存區(qū)內(nèi)容提交
接著上一點,我們準(zhǔn)備將 test2.txt 進行正式提交。
但是,但是,但是,我就不提交(微笑臉)。
直接提交豈不是太簡單了?現(xiàn)在我在提交之前又反悔了,突然想起來還想加一句 “hello world”,那就加唄,加完我們再看看會變成什么鬼樣子。
$ 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.
哎!不對啊。test2.txt 這個文件剛剛不是在 “Changes to be committed” 下面嗎?現(xiàn)在怎么同時又存在于 “Changes not staged for commit” 下面了。這個文件怎么同時存在 “已暫存” 和 “未暫存” 兩種狀態(tài)了?
附:這部分演示流程如下:
別急,跟我往下繼續(xù)看!那要不我們先執(zhí)行下提交看看會變成什么狀態(tài)?好!說干就干!對了,忘了說了,提交命令是 “git commit -m ‘這是提交說明’”,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” 部分還存在一個 test2.txt,這是為啥?
其實,提交后只把前面步驟中執(zhí)行了 “git add” 那部分修改進行了提交,而后面我再追加的 “hello world” 的內(nèi)容由于沒有執(zhí)行 “git add”,并沒有納入 git 的暫存區(qū),提交也就自然提交不了。那想要再提交這部分內(nèi)容怎么辦?簡單??!繼續(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)正常了。是不是一切都是那么熟悉?就像初戀般的感覺。
附:這部分演示流程如下:
通過這個過程,我們可以看到,“git commit” 只把暫存區(qū)的修改提交了,也就是第一次執(zhí)行了 “git add” 的修改被提交了,第二次的修改不會被提交。
4. 比較工作區(qū)和版本庫的文件差異
前面步驟我們操作了修改文件后如何去添加到暫存區(qū)、提交版本庫等流程,那么如果我們提交后又在本地做了修改,怎么比較版本庫和本地工作區(qū)的差異呢?自然也是有辦法的,執(zhí)行如下命令就可以了:
$ git diff HEAD -- test.txt
我們試著在提交版本庫后又做一些修改,比如我追加一行內(nèi)容,再看下與版本庫的差異,演示流程如下:
5. 跳過暫存區(qū)直接提交
我們知道,如果對一個文件做了修改,想要提交至版本庫之前必須先加入暫存區(qū)。但是,git 提供了一個偷懶的辦法(畢竟,程序員效率至上嘛),就是可以跳過暫存區(qū)提交,使用如下命令:
$ git commit -a -m '備注'
演示流程如下:
注意:“git commit -a -m” 這個命令必須在文件內(nèi)容修改后使用,如果你的文件是剛新建的并且還沒提交過,那么還是需要先 “git add”。
正常的開發(fā)過程中,對于提交日志的規(guī)范都有要求。日志是我們作為歷史版本維護的一個很重要的內(nèi)容,一個好的日志模板可以方便進行代碼 review,以及后續(xù)開發(fā)者快速了解歷史問題等等。本教程只是演示,實際開發(fā)中請遵守具體規(guī)范!
6. 總結(jié)
溫故而知新,我們先走起。本節(jié)課內(nèi)容總結(jié)如下:
- 查看文件狀態(tài):git status
- 將修改添加到暫存區(qū):git add 文件名
- 將暫存區(qū)內(nèi)容提交:git commit -m ‘描述’
- 比較工作區(qū)和版本庫的文件差異:git diff HEAD – 文件名
- 跳過暫存區(qū)直接提交:git commit -a
好了,今天的內(nèi)容我們就講到這里,希望大家多加練習(xí),早日 get 到 git 的精髓!