git rebase -i

在使用git作為源代碼管理工具的時(shí)候,開發(fā)的時(shí)經(jīng)常會(huì)面臨一個(gè)常見(jiàn)的問(wèn)題,多個(gè)commit 需要合并為一個(gè)完整的commit提交。

在一個(gè)基本的迭代周期里,你會(huì)有很多次commit,有跟配置文件相關(guān)的,有跟代碼相關(guān)的,甚至有跟下次發(fā)布fixbug相關(guān)的。這些都是你在完成本地開發(fā)的時(shí)候一個(gè)變化記錄而已。但是當(dāng)你需要將你的迭代項(xiàng)目作為一次發(fā)布提交時(shí)就需要整合所有之前提交的那些很零碎的commit。

根據(jù)基本規(guī)范,你的commit應(yīng)該類似"release:20161023_imageprint",在此commit里應(yīng)該是完整的提交。

合并多個(gè)commit為一個(gè)完整的commit

我先基于develop主分支拉出一個(gè)功能分支(每個(gè)人和每個(gè)公司對(duì)分支的管理都不太一樣,這里不需要太糾結(jié)。)。這里的develop是開發(fā)主分支,所有的開發(fā)功能代碼都需要回歸到這個(gè)develop分支中去。

git branch -a –vv

1

develop_fixbug_imageprint 分支是我基于遠(yuǎn)程develop分支拉出來(lái)的開發(fā)分支,我會(huì)基于這個(gè)分支來(lái)fix一些bug。我們分別看下develop、develop_fixbug_imageprint commit log。

git checkout develop
git  log

2

git checkout develop_fixbug_imageprint
git log

3

develop_fixbug_imageprint的commit log是和devleop commit log 一模一樣。我們現(xiàn)在切換到develop_fixbug_imageprint進(jìn)行一些操作。

添加一個(gè)1.txt文件,然后git add . ,git commit –m’add 1.txt’。
再添加一個(gè)2.txt 文件,然后git add . ,git commit –m’add 2.txt’。 

4

現(xiàn)在develop_fixbug_imageprint分支里有兩個(gè)commit。這兩個(gè)commit都是為了fix當(dāng)前這個(gè)bug而做的兩個(gè)提交?,F(xiàn)在我們要合并代碼上主develop分支??偛荒馨堰@兩個(gè)commit直接提交上去,這里還好只有兩個(gè)commit,但是一般項(xiàng)目開發(fā)周期兩個(gè)星期的話,你起碼有十幾個(gè)commit。那這樣提交上去之后就很難管理和跟蹤。(我以前都是這樣干的,現(xiàn)在發(fā)現(xiàn)這樣不好跟蹤管理。)

那么我們?nèi)绾瓮瓿蛇@個(gè)合并commit尼,就需要用到git rebase 命令。

先來(lái)解釋下git rebase 。你其實(shí)可以把它理解成是“重新設(shè)置基線”,將你的當(dāng)前分支重新設(shè)置開始點(diǎn)。這個(gè)時(shí)候才能知道你當(dāng)前分支于你需要比較的分支之間的差異。

比如,develop_fixbug_imageprint分支是來(lái)自develop分支,那么從test commit開始后面我們基本上都是各自發(fā)展,現(xiàn)在在develop_fixbug_imageprint分支上有兩個(gè)commit,我們需要找一個(gè)基準(zhǔn),這個(gè)基準(zhǔn)就是git需要找到哪些是你后來(lái)提交的commmit,總的有個(gè)參照。

git reabse –i develop

5

git rebase 立馬知道develop與develop_fixbug_imageprint之間的差異。因?yàn)槲覀兪腔赿evelop設(shè)置rebase的。git rebase –i ,這里的”-i“是指交互模式。就是說(shuō)你可以干預(yù)rebase這個(gè)事務(wù)的過(guò)程,包括設(shè)置commit message,暫停commit等等。

這里我們要求很簡(jiǎn)單就是合并之前的commit且重新設(shè)置commit message。

我們?cè)O(shè)置第二個(gè)”pick 657a291 add 2.txt” 為” s 657a291 add 2.txt”這里的s就是squash命令的簡(jiǎn)寫。

6

跳出來(lái)了一個(gè)臨時(shí)文件,最上面是兩行commit message。我們修改下這個(gè)總體的commit message。

7

刪除之前的兩條message(ESC dd),設(shè)置一總的message 然后保存退出。(ESC wq)

8

我們查看下log。git log

9

是不是沒(méi)有了之前的兩個(gè)commit。

原理很簡(jiǎn)單:rebase需要基于一個(gè)分支來(lái)設(shè)置你當(dāng)前的分支的基線,這基線就是當(dāng)前分支的開始時(shí)間軸向后移動(dòng)到最新的跟蹤分支的最后面,這樣你的當(dāng)前分支就是最新的跟蹤分支。這里的操作是基于文件事務(wù)處理的,所以你不用怕中間失敗會(huì)影響文件的一致性。在中間的過(guò)程中你可以隨時(shí)取消rebase 事務(wù)。git rebase –abort

在進(jìn)入git rebase –i 交互模式,你可以做的事情就很多了,可以設(shè)置edit 編輯commit 內(nèi)容,可以讓他暫停commit操作。等等。

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

相關(guān)閱讀更多精彩內(nèi)容

  • git常用命令 GIT常用命令備忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章閱讀 8,877評(píng)論 1 26
  • 一、 Git 常用命令速查 git branch 查看本地所有分支 git status 查看當(dāng)前狀態(tài) git c...
    LOVE_晴天閱讀 2,412評(píng)論 0 10
  • 2016年的那個(gè)夏天,天氣很燥熱,尤其是六月,積累在枯燥課堂里的膩濕空氣,即便是偷偷地從校外小賣鋪里買的冰棒也不能...
    三分燒閱讀 3,344評(píng)論 79 74
  • 馬斯洛需求理論:各個(gè)層次由低到高逐漸發(fā)展,但又不是完全按照這個(gè)本次發(fā)展。當(dāng)一個(gè)層次的需求不能滿足時(shí),會(huì)轉(zhuǎn)向另一個(gè)層...
    423429d90f38閱讀 231評(píng)論 0 2
  • 我兩點(diǎn)多就起夜,回到床上,一直也沒(méi)有睡意,就在客廳里翻看別人的簡(jiǎn)書,是的,越看越覺(jué)得自己過(guò)得不如人,越看越覺(jué)得自己...
    我心我愿秀閱讀 172評(píng)論 2 2

友情鏈接更多精彩內(nèi)容