歡迎關(guān)注微信公眾號:全棧工廠
本文主要參考
rebase在git中是一個非常有魅力的命令盹舞,使用得當(dāng)會極大提高自己的工作效率熏迹;相反锣吼,如果亂用,會給團隊中其他人帶來麻煩撼玄。它的作用簡要概括為:可以對某一段線性提交歷史進行編輯、刪除饲嗽、復(fù)制聘芜、粘貼;因此趋厉,合理使用rebase命令可以使我們的提交歷史干凈寨闹、簡潔!
前提:不要通過rebase對任何已經(jīng)提交到公共倉庫中的commit進行修改(你自己一個人玩的分支除外)
1.合并多個commit為一個完整commit
當(dāng)我們在本地倉庫中提交了多次君账,在我們把本地提交push到公共倉庫中之前繁堡,為了讓提交記錄更簡潔明了,我們希望把如下分支B、C椭蹄、D三個提交記錄合并為一個完整的提交闻牡,然后再push到公共倉庫。現(xiàn)在我們在測試分支上添加了四次提交绳矩,我們的目標(biāo)是把最后三個提交合并為一個提交:
這里我們使用命令:
git rebase -i [startpoint] [endpoint]
其中-i
的意思是--interactive
罩润,即彈出交互式的界面讓用戶編輯完成合并操作,[startpoint]
[endpoint]
則指定了一個編輯區(qū)間翼馆,如果不指定[endpoint]
割以,則該區(qū)間的終點默認(rèn)是當(dāng)前分支HEAD
所指向的commit
(注:該區(qū)間指定的是一個前開后閉的區(qū)間)。
在查看到了log日志后应媚,我們運行以下命令:
git rebase -i 36224db
或:
git rebase -i HEAD~3
然后我們會看到如下界面:
上面未被注釋的部分列出的是我們本次rebase操作包含的所有提交严沥,下面注釋部分是git為我們提供的命令說明。每一個commit id 前面的
pick
表示指令類型中姜,git 為我們提供了以下幾個命令:
根據(jù)我們的需求丢胚,我們將commit內(nèi)容編輯如下:
- 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)
然后是注釋修改界面:
2.將某一段commit粘貼到另一個分支上
當(dāng)我們項目中存在多個分支翩瓜,有時候我們需要將某一個分支中的一段提交同時應(yīng)用到其他分支中,就像下圖:
我們希望將develop分支中的C~E部分復(fù)制到master分支中携龟,這時我們就可以通過rebase命令來實現(xiàn)(如果只是復(fù)制某一兩個提交到其他分支兔跌,建議使用更簡單的命令:
git cherry-pick
)。在實際模擬中骨宠,我們創(chuàng)建了master和develop兩個分支:
master分支:
git rebase [startpoint] [endpoint] --onto [branchName]
其中浮定,[startpoint]
[endpoint]
仍然和上一個命令一樣指定了一個編輯區(qū)間(前開后閉),--onto
的意思是要將該指定的提交復(fù)制到哪個分支上层亿。
所以桦卒,在找到C(90bc0045b)和E(5de0da9f2)的提交id后,我們運行以下命令:
git rebase 90bc0045b^ 5de0da9f2 --onto master
注:因為[startpoint]
[endpoint]
指定的是一個前開后閉的區(qū)間匿又,為了讓這個區(qū)間包含C提交方灾,我們將區(qū)間起始點向后退了一步。
運行完成后查看當(dāng)前分支的日志:
所以旭绒,雖然此時HEAD所指向的內(nèi)容正是我們所需要的鸟妙,但是master分支是沒有任何變化的焦人,
git
只是將C~E部分的提交內(nèi)容復(fù)制一份粘貼到了master所指向的提交后面,我們需要做的就是將master所指向的提交id設(shè)置為當(dāng)前HEAD所指向的提交id就可以了重父,即:
git checkout master
git reset --hard 0c72e64
此時我們才大功告成花椭!
注:文中如有任何錯誤,請各位批評指正