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