場(chǎng)景
首先我們來(lái)看一個(gè)場(chǎng)景
- 正常情況的我們分支合并之后應(yīng)該就像這樣的
對(duì)于這樣的分支合并大家一定沒(méi)有異議筋栋。
- 那么碰到這種情況 怎么處理呢
當(dāng)然 reset掉develop最上面的點(diǎn)示姿,然后再行merge B即可
- 那么碰到這種情況 怎么處理呢
方案A
將B-bugfix分支的所有代碼保存下來(lái)乞娄,然后將develop回退回去乱投,然后在正常merge之后再將B-bugfix分支的所有代碼吐出來(lái)哮笆,然后再Commit一個(gè)點(diǎn)凛膏。
這樣的話神僵,能解決問(wèn)題,但是所有的Commit將會(huì)變成一個(gè)點(diǎn)呕诉,雖然是Can缘厢,但不是Best。
方案B
直接將多出來(lái)的A分支再次合并到develop上义钉。這樣也能保證代碼不丟失昧绣,但是相比之下 分支便不太規(guī)范。
最終方案
文檔
意思就是如果你想將topic分支移動(dòng)到master上捶闸,你就可以通過(guò)rebase --onto 來(lái)實(shí)現(xiàn)夜畴。
git rebase --onto master next topic
意思就是 在master之上 把從next分支切出的topic分支 移動(dòng)到master的最頂部
那么想想 對(duì)應(yīng)上述情況怎么辦呢。
- 將develop回退到根節(jié)點(diǎn)
- 重新merge A和B
- git rebase --onto develop develop B-bugfix
- 可能會(huì)有沖突删壮,解決沖突 git rebase --continue
另外場(chǎng)景
原理
就拿上面場(chǎng)景為例贪绘。git rebase的時(shí)候,其實(shí)就是先從master分支上切出一個(gè)新的topicB作為工作目錄央碟,再將之前topicB上打補(bǔ)丁的點(diǎn)全部在新的topicB上全部打上税灌。如果在打補(bǔ)丁的時(shí)候出現(xiàn)了沖突,git rebase就會(huì)停止亿虽,要求先解決沖突菱涤,然后在continue的時(shí)候就會(huì)繼續(xù)將剩余的補(bǔ)丁點(diǎn)打完。最后新的分支取代了原來(lái)的分支洛勉。