首頁 > 農業
【第二講】git如何選擇性合併背景,如何在開發過程中進行多次commit?
由 小安聊程式設計 發表于 農業2021-05-16
簡介exec:執行shell命令(縮寫:x)drop:我要丟棄該commit(縮寫:d)根據我們的需求,我們將commit內容編輯如下:pick d2cf1f9 fix: 第一次提交s 47971f6 fix: 第二次提交s fb28c8d f
git如何選擇性合併
背景
一個專案通常是由一個團隊中的多個人共同維護,在開發一個功能迭代時會切分支出來進行開發,開發者在開發過程中多多少少會對程式碼各種修改,本地分支會進行多次commit並且推到遠端當前分支,最後合併到master後,會看到亂七八糟的所有增量修改歷史。其實對別人來說,我們的改動應該就是增加或者刪除,給別人看開發過程的增量反而太亂。於是我們可以將feature分支的提交合併成一個版本後然後再merge到主幹,形成
線性的commit記錄,
主幹看起來就清爽多了。
目的
合併主幹分支比較清爽乾淨
一個
feature開發僅一個commit版本標記
在Review程式碼時方便本次迭代的相關改動
Rebase簡介
rebase的作用簡要概括為:可以對某一段線性提交歷史進行編輯、刪除、複製、貼上;因此,合理使用rebase命令可以使我們的提交歷史乾淨、簡潔!
但是需要注意的是:
不要透過rebase對任何已經提交到公共倉庫中的commit進行修改(在你開發分支即可)
反面例子
新建一個repo rebase-test;新建開發分支dev;在開發分支是commit了三次然後merge到master分支;然後git log或者git log ——oneline;可以發現dev分支上的每次commit都體現到了master上
fb28c8d (HEAD -> master, origin/master, origin/dev, origin/HEAD, dev) fix: 第三次提交47971f6 fix: 第二次提交d2cf1f9 fix: 第一次提交26bac61 Initial commit
如果用git log可以按s向下翻log
git log ——oneline 可以一行展現
4。 具體操作
當我們在本地倉庫中提交了多次,在我們把本地提交push到公共倉庫中之前,為了讓提交記錄更簡潔明瞭,我們希望把如下分支B、C、D三個提交記錄合併為一個完整的提交,然後再push到公共倉庫。
這裡我們使用命令:
git rebase -i [startpoint] [endpoint]
其中-i的意思是——interactive,即彈出互動式的介面讓使用者編輯完成合並操作,[startpoint] [endpoint]則指定了一個編輯區間,如果不指定[endpoint],則該區間的終點預設是當前分支HEAD所指向的commit(注:該區間指定的是一個前開後閉的區間)。 在檢視到了log日誌後,我們執行以下命令:
git rebase -i 36224db
或者
git rebase -i HEAD~3
然後我們會看到如下介面:
上面未被註釋的部分列出的是我們本次rebase操作包含的所有提交,下面註釋部分是git為我們提供的命令說明。每一個commit id 前面的pick表示指令型別,git 為我們提供了以下幾個命令:
pick:保留該commit(縮寫:p)
reword:保留該commit,但我需要修改該commit的註釋(縮寫:r)
edit:保留該commit, 但我要停下來修改該提交(不僅僅修改註釋)(縮寫:e)
squash:將該commit和前一個commit合併(縮寫:s),兩個註釋分成兩行。
fixup:將該commit和前一個commit合併,但我不要保留該提交的註釋資訊(縮寫:f),只保留前一個commit資訊。
exec:執行shell命令(縮寫:x)
drop:我要丟棄該commit(縮寫:d)
根據我們的需求,我們將commit內容編輯如下:
pick d2cf1f9 fix: 第一次提交
s 47971f6 fix: 第二次提交
s fb28c8d fix: 第三次提交
上面的意思就是把第二次、第三次提交都合併到第一次提交上
然後wq儲存退出後是註釋修改介面:
可以瀏覽態 按下兩個dd可以刪除一行
最終的編輯效果如下:
編輯完儲存即可完成commit的合併了:
總結:git rebase 後再git merge
rebase之前需要經master分支拉到最新
切換分支到需要rebase的分支,這裡是dev分支
執行git rebase master,有衝突就解決衝突,解決後直接git add 。 再git rebase ——continue即可