Git在rebase時(shí)如何保留merge commit(實(shí)用?。?/h1>
rebase是git中一個(gè)神奇的命令,可以讓并行的提交,變得像線性開(kāi)發(fā)的一樣,最近發(fā)現(xiàn)rebase在遇到merge commit時(shí)可能和認(rèn)知不太一樣,本文通過(guò)一個(gè)例子來(lái)講解下git rebase遇到merge commit時(shí)該如何應(yīng)對(duì)
經(jīng)典rebase
先來(lái)看下rebase的典型使用場(chǎng)景,假設(shè)我們有如下一個(gè)提交記錄

當(dāng)dev想同步上游(master)的修改時(shí),有兩種方案,一種是merge,一種是rebase
merge會(huì)創(chuàng)建一個(gè)commit節(jié)點(diǎn),并且能夠保留分支關(guān)系
$ git merge master

但是一般上游到下游的操作,是不需要保留分支關(guān)系的,rebase正是為了這個(gè)場(chǎng)景設(shè)計(jì)的,rebase會(huì)將dev上的節(jié)點(diǎn),重新在master上重新創(chuàng)建一遍,看起來(lái)就是是在master分支最后開(kāi)發(fā)的一樣
$ git rebase master

至此就介紹完了rebase常規(guī)的使用場(chǎng)景
merge rebase
如果被rebase的分支上有merge commit,會(huì)發(fā)生什么呢?假設(shè)我們有如下的log tree(請(qǐng)?jiān)徫覒械卯?huà)圖了^_^)
* 31ef4ec (HEAD -> master) e
| * b554f2d (dev) Merge branch 'test' into dev
| |\
| | * 853aaf6 (test) c
| * | 1af86fa d
| |/
| * c1b49a5 b
|/
* 763a350 a
master分支在dev分支后面又有了新的提交,dev分支合并了test分支,現(xiàn)在dev分支想同步master分支,繼續(xù)使用rebase操作
* 8924fda (HEAD -> dev) c
* 06201b2 d
* e0c6b78 b
* 31ef4ec (master) e
| * 853aaf6 (test) c
| * c1b49a5 b
|/
* 763a350 a
可以rebase將merge commit拋棄了,同時(shí)test分支上的提交c的內(nèi)容被patch到了dev分支上
這可能和我的認(rèn)知不太一樣,我希望的效果是繼續(xù)保留merge commit,rebase 為我們提供--rebase-merges參數(shù)來(lái)這個(gè)問(wèn)題
$ git rebase --rebase-merges master
看下log tree,變基成功了,merge commit被保留了,但test分支也被變基了,test分支上的commit還是被復(fù)制了一份
* 88e6cf7 (HEAD -> dev) Merge branch 'test' into dev
|\
| * e2fae10 c
* | 65869a2 d
|/
* e61592d b
* 31ef4ec (master) e
| * 853aaf6 (test) c
| * c1b49a5 b
|/
* 763a350 a
總結(jié)
最后建議大家merge和rebase盡量使用一種即可,即rebase的代碼,不要包含merge commit;使用了merge操作,就不要在rebase了
最后
如果你覺(jué)得這篇內(nèi)容對(duì)你挺有啟發(fā),我想邀請(qǐng)你幫我三個(gè)小忙:
點(diǎn)個(gè)「在看」,讓更多的人也能看到這篇內(nèi)容(喜歡不點(diǎn)在看,都是耍流氓 -_-)
歡迎加我微信「 sherlocked_93 」拉你進(jìn)技術(shù)群,長(zhǎng)期交流學(xué)習(xí)...
關(guān)注公眾號(hào)「前端下午茶」,持續(xù)為你推送精選好文,也可以加我為好友,隨時(shí)聊騷。

點(diǎn)個(gè)在看支持我吧,轉(zhuǎn)發(fā)就更好了
瀏覽
74
rebase是git中一個(gè)神奇的命令,可以讓并行的提交,變得像線性開(kāi)發(fā)的一樣,最近發(fā)現(xiàn)rebase在遇到merge commit時(shí)可能和認(rèn)知不太一樣,本文通過(guò)一個(gè)例子來(lái)講解下git rebase遇到merge commit時(shí)該如何應(yīng)對(duì)
經(jīng)典rebase
先來(lái)看下rebase的典型使用場(chǎng)景,假設(shè)我們有如下一個(gè)提交記錄

當(dāng)dev想同步上游(master)的修改時(shí),有兩種方案,一種是merge,一種是rebase
merge會(huì)創(chuàng)建一個(gè)commit節(jié)點(diǎn),并且能夠保留分支關(guān)系
$ git merge master
但是一般上游到下游的操作,是不需要保留分支關(guān)系的,rebase正是為了這個(gè)場(chǎng)景設(shè)計(jì)的,rebase會(huì)將dev上的節(jié)點(diǎn),重新在master上重新創(chuàng)建一遍,看起來(lái)就是是在master分支最后開(kāi)發(fā)的一樣
$ git rebase master
至此就介紹完了rebase常規(guī)的使用場(chǎng)景
merge rebase
如果被rebase的分支上有merge commit,會(huì)發(fā)生什么呢?假設(shè)我們有如下的log tree(請(qǐng)?jiān)徫覒械卯?huà)圖了^_^)
* 31ef4ec (HEAD -> master) e
| * b554f2d (dev) Merge branch 'test' into dev
| |\
| | * 853aaf6 (test) c
| * | 1af86fa d
| |/
| * c1b49a5 b
|/
* 763a350 amaster分支在dev分支后面又有了新的提交,dev分支合并了test分支,現(xiàn)在dev分支想同步master分支,繼續(xù)使用rebase操作
* 8924fda (HEAD -> dev) c
* 06201b2 d
* e0c6b78 b
* 31ef4ec (master) e
| * 853aaf6 (test) c
| * c1b49a5 b
|/
* 763a350 a可以rebase將merge commit拋棄了,同時(shí)test分支上的提交c的內(nèi)容被patch到了dev分支上
這可能和我的認(rèn)知不太一樣,我希望的效果是繼續(xù)保留merge commit,rebase 為我們提供--rebase-merges參數(shù)來(lái)這個(gè)問(wèn)題
$ git rebase --rebase-merges master看下log tree,變基成功了,merge commit被保留了,但test分支也被變基了,test分支上的commit還是被復(fù)制了一份
* 88e6cf7 (HEAD -> dev) Merge branch 'test' into dev
|\
| * e2fae10 c
* | 65869a2 d
|/
* e61592d b
* 31ef4ec (master) e
| * 853aaf6 (test) c
| * c1b49a5 b
|/
* 763a350 a總結(jié)
最后建議大家merge和rebase盡量使用一種即可,即rebase的代碼,不要包含merge commit;使用了merge操作,就不要在rebase了
最后
如果你覺(jué)得這篇內(nèi)容對(duì)你挺有啟發(fā),我想邀請(qǐng)你幫我三個(gè)小忙:
點(diǎn)個(gè)「在看」,讓更多的人也能看到這篇內(nèi)容(喜歡不點(diǎn)在看,都是耍流氓 -_-)
歡迎加我微信「 sherlocked_93 」拉你進(jìn)技術(shù)群,長(zhǎng)期交流學(xué)習(xí)...
關(guān)注公眾號(hào)「前端下午茶」,持續(xù)為你推送精選好文,也可以加我為好友,隨時(shí)聊騷。

