在上一篇Git使用教程之版本回退我們已經學會如何使用git進行版本管理,并嘗試提交和版本回退。接下來我們將繼續(xù)學習,有關提交的高級用法。例如我們想把多次提交合并成一次提交,把漏提交的內容追加到上次提交。本節(jié)我們將使用兩個重要的命令
git commit --amend和git rebase命令。
git commit --amend追加提交
首先我們設想下面一種情況,在開發(fā)過程中,你為了完成某一項工作,修改了很多個文件,最后當工作完成的時候,我們需要將這次完成的功能提交到代碼庫。提交的時候你可能會這么注釋“finish xxx work”完成了某某某工作。這個工作完成之后,你可能要進行下一個工作。在進行下個工作之前,你突然發(fā)現(xiàn)剛才的提交漏了兩個文件,這個時候如果你再次提交一次,顯然是不合適的。因為那樣會產生兩次提交不利于以后的版本維護。那么這個時候就需要用到git commit --amend了。千說不如一練??聪旅娴膁emo。
首先新建一個文件1.txt和新建一個2.txt,然后將1.txt添加到暫存區(qū),并提交到版本庫,log為commit 1.txt。然后將2.txt添加到暫存區(qū),然后提交的時候使用--amend
會出現(xiàn)如下的界面
1 commit 1.txt
2
3 # Please enter the commit message for your changes. Lines starting
4 # with '#' will be ignored, and an empty message aborts the commit.
5 #
6 # Date: Wed Jul 11 15:19:00 2018 +0800
7 #
8 # On branch master
9 # Changes to be committed:
10 # new file: 1.txt
11 # new file: 2.txt
12 #
這個時候我們看到了第一次提交的內容和log。提交完成之后我們查看當前git狀態(tài)和提交歷史。我們發(fā)現(xiàn)雖然我們提交了兩次,但是log中只出現(xiàn)了一次提交。因為我們使用--amend將第二次提交追加到第一次提交上了。這樣會使我們的提交歷史變得整潔清晰。
commit ce42e88895cc87c43458c284df911b500b7e94fd (HEAD -> master)
Author: snowzhang <xxxx@aliyun.com>
Date: Wed Jul 11 15:19:00 2018 +0800
commit 1.txt and commit 2.txt
git rebase 合并多次提交
rebase在git中是一個非常有魅力的命令,使用得當會極大提高自己的工作效率;相反,如果亂用,會給團隊中其他人帶來麻煩。它的作用簡要概括為:可以對某一段線性提交歷史進行編輯、刪除、復制、粘貼;因此,合理使用rebase命令可以使我們的提交歷史干凈、簡潔!
前提:不要通過rebase對任何已經提交到公共倉庫中的commit進行修改(你自己一個人玩的分支除外)
當我們在本地倉庫中提交了多次,在我們把本地提交push到公共倉庫中之前,為了讓提交記錄更簡潔明了,我們希望把如下分支B、C、D三個提交記錄合并為一個完整的提交,然后再push到公共倉庫。

rebase命令
- 首先創(chuàng)建三次次提交BCD
snowzhang@snowdeMBP-2:~/gitLearn$ git log
commit 9a931be7950033df6905b8b77dc590cdfc37367c (HEAD -> master)
Author: snowzhang <snxxxxxxx@aliyun.com>
Date: Wed Jul 11 15:50:55 2018 +0800
commit D
commit 68b8f4ce42e0201fb731085790ffeb190d9747b5
Author: snowzhang <snxxxxxxx@aliyun.com>
Date: Wed Jul 11 15:50:06 2018 +0800
commit C
commit d9bebec678b202ac388518ed0aed3a2fb7bc85b3
Author: snowzhang <snxxxxxxx@aliyun.com>
Date: Wed Jul 11 15:49:27 2018 +0800
commit B
這里我們使用命令:
git rebase -i [startpoint] [endpoint]
其中-i的意思是--interactive,即彈出交互式的界面讓用戶編輯完成合并操作,[startpoint] [endpoint]則指定了一個編輯區(qū)間,如果不指定[endpoint],則該區(qū)間的終點默認是當前分支HEAD所指向的commit(注:該區(qū)間指定的是一個前開后閉的區(qū)間)。
在查看到了log日志后,我們運行以下命令:
git rebase -i ce42e8889

上面顯示未注釋區(qū)域為我們的編輯區(qū)域,下面注釋區(qū)的Commands為命令,具體命令解釋如下:
- pick:保留該commit(縮寫:p)
- reword:保留該commit,但我需要修改該commit的注釋(縮寫:r)
- edit:保留該commit, 但我要停下來修改該提交(不僅僅修改注釋)(縮寫:e)
- squash:將該commit和前一個commit合并(縮寫:s)
- fixup:將該commit和前一個commit合并,但我不要保留該提交的注釋信息(縮寫:f)
- exec:執(zhí)行shell命令(縮寫:x)
- drop:我要丟棄該commit(縮寫:d)
我們將按照上面的命令提示,修改pick成下面這樣
pick d9bebec commit B
s 68b8f4c commit C
s 9a931be commit D
最終查看git log會給出這樣的提示
commit 3ab108fd7e0fb3a7477763f2ef8032251105e69f (HEAD -> master)
Author: snowzhang <snxxxx@aliyun.com>
Date: Wed Jul 11 15:49:27 2018 +0800
commit B
commit C
commit D
證明我們已經將BCD三次提交合并成一次提交了。
至此,關于兩種合并方式已經演示完畢。寫的不好,還請多多包涵。
下一節(jié),講講什么是工作區(qū),暫存區(qū),和git庫,以及他們之間的關系。