git rebase(变基)—— Git 学习笔记 19
git rebase(變基)
認(rèn)識 git rebase
假設(shè)你現(xiàn)在基于遠(yuǎn)程分支"origin",創(chuàng)建一個(gè)叫"mywork"的分支。
$ git checkout -b mywork origin現(xiàn)在我們在 mywork 分支做一些修改,生成兩個(gè)提交(C5和C6).
但是與此同時(shí),有些人也在"origin"分支上做了一些修改并且做了提交了。
你可以用"fetch"命令把"origin"分支上的修改拉下來(但是不合并); 正如下圖,"origin"和"mywork"這兩個(gè)分支“分道揚(yáng)鑣”了。
你可以用"merge"命令把"origin"分支合并到你的分支,這會生成一個(gè)合并提交(C7)。
但是,如果你不喜歡分叉與合并,你想讓"mywork"分支的歷史看起來像一條直線,那你可以用 rebase命令
$ git checkout mywork $ git rebase origin這會把分叉之后的"mywork"分支(C5,C6)“嫁接”到“origin”分支的頂端。如下圖:
當(dāng)“mywork”分支更新之后,它會指向最后一個(gè)新創(chuàng)建的提交(C6’). 而那些老的提交(C5,C6)會被Git 的垃圾收集機(jī)制丟棄,如下圖:
我們可以看一下用 merge 和用 rebase 所產(chǎn)生的歷史的區(qū)別:
理解 git rebase
之前我們說過git cherry-pick命令(可以參考我的博文git cherry-pick 詳解).
其實(shí)“git rebase”就是一系列的“cherry-pick”,只是這一系列的動作用一條命令(git rebase)給完成了。你完全可以通過多次手動“cherry-pick”來復(fù)制其行為(不過不太方便,更容易出現(xiàn)人為錯(cuò)誤)。
假設(shè)你要把 topic 分支 rebase 到 master 分支上
D <-- topic(*) | | C <-- master B | |/ | A你會運(yùn)行命令:
git checkout topic git rebase master在上面的上下文中,“git rebase master”這條命令的潛臺詞是:
git checkout master # 切換到master分支
git checkout -b topic_rebased # 基于master分支創(chuàng)建并切換一個(gè)新分支,比如叫 topic_rebased
for each commit C in master…topic # 對于在topic分支且不在master分支的每個(gè)提交 C
? git cherry-pick C # 揀選 C 到 topic_rebased 分支
忘記"topic" 的過去, 把 topic_rebased 改名為"topic"
過程如下圖:
D <-- topic(*) | | C <-- master B | |/ | A D <-- topic | | C <-- master, <--topic_rebased(*) B | |/ | A B' <-- topic_rebased(*) D | | | | C <-- master B / |/ | A D' <-- topic_rebased(*)|B' D | | | | C <-- master B / |/ | A D' <-- topic(*) | B' | C <-- master | A在 rebase 的過程中,也許會出現(xiàn)沖突 (conflict)。如果遇到?jīng)_突,Git 會停止 rebase,并讓你去解決沖突;在解決完沖突后,可以用"git-add"命令去標(biāo)記此沖突已經(jīng)解決。 然后,你無需執(zhí)行 git commit,只要執(zhí)行:
$ git rebase --continue這樣 git 會繼續(xù)應(yīng)用余下的補(bǔ)丁。
如果你rebase到一半,突然后悔了,你可以用--abort參數(shù)來終止 rebase,并且"mywork" 分支會回到 rebase 開始前的狀態(tài)。
$ git rebase --abort----請各位磚家斧正----
【完】
參考資料
【1】https://stackoverflow.com/questions/10058068/in-a-git-cherry-pick-or-rebase-merge-conflict-how-are-base-aka-the-ancestor
【2】http://gitbook.liuhui998.com/4_2.html
【3】https://codeday.me/bug/20180228/136734.html
總結(jié)
以上是生活随笔為你收集整理的git rebase(变基)—— Git 学习笔记 19的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git cherry-pick 详解 —
- 下一篇: const与static的区别