Git使用之追加提交和合并提交

在上一篇Git使用教程之版本回退我們已經學會如何使用git進行版本管理,并嘗試提交和版本回退。接下來我們將繼續(xù)學習,有關提交的高級用法。例如我們想把多次提交合并成一次提交,把漏提交的內容追加到上次提交。本節(jié)我們將使用兩個重要的命令git commit --amendgit 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 合并多次提交

rebasegit中是一個非常有魅力的命令,使用得當會極大提高自己的工作效率;相反,如果亂用,會給團隊中其他人帶來麻煩。它的作用簡要概括為:可以對某一段線性提交歷史進行編輯、刪除、復制、粘貼;因此,合理使用rebase命令可以使我們的提交歷史干凈、簡潔!
前提:不要通過rebase對任何已經提交到公共倉庫中的commit進行修改(你自己一個人玩的分支除外)
當我們在本地倉庫中提交了多次,在我們把本地提交push到公共倉庫中之前,為了讓提交記錄更簡潔明了,我們希望把如下分支B、C、D三個提交記錄合并為一個完整的提交,然后再push到公共倉庫。

git rebase commit.png
下面開始實踐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
rebase vim .png

上面顯示未注釋區(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庫,以及他們之間的關系。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 常聽人說,那不就一句話的事嗎? 我就在想,這一句話能夠辦成什么事?雖然有些人喜歡快言快語,有些人喜歡言簡意賅,但一...
    Josh叔叔閱讀 274評論 0 1
  • “身體是革命的本錢”這句婦孺皆知的話曾幾何時消失在我們的生活中,還能記起你已經有多久沒有鍛煉過嗎,朋友? 前幾天公...
    夢里都是堅定閱讀 251評論 0 0
  • 問題1: 今天在運行模擬器的時候出現(xiàn)了這個問題。每次運行都報這個錯誤 Could not hardlink cop...
    何康老鬼閱讀 1,946評論 0 0
  • 今天跟鄰居陪我去一個好遠的地方,確認一個事情,我們從十點鐘出發(fā),一直走到晚上七點鐘才回來。 總結出一個字,那叫做累...
    慈覺閱讀 273評論 0 0
  • 中午放學的時候我去接的孩子,遠遠的我就看到他們班級了,他也看到了我,但沒有提前下隊,直到到了目的地,解散后...
    健康快樂_4123閱讀 447評論 0 0

友情鏈接更多精彩內容