如何理解git rebase奉呛?

在merge PR的過程中计螺,rebase and merge會產(chǎn)生沖突,因此需要補充一下Git rebase的知識點瞧壮。

Understanding Rebase (And Merge) in Git

merge 是Git中最簡單也是最常用的集成change的方法咆槽,但是這并不是唯一的一種方式陈轿。
Rebase是另外一種可選的但是略微高級的集成方式。

合并提交的case

通常情況下秦忿,一個由人類認(rèn)真創(chuàng)建的commit麦射,是一個有意義的單元:它僅僅包含相關(guān)的change并且每個commit都伴隨著一個comment。
有一種merge commit可以讓所有comments丟失:Git自動創(chuàng)建的commit灯谣,并且由Git填充所有的differ change潜秋。沒有語義,沒有主題胎许。當(dāng)然峻呛,這些獨立commits的內(nèi)容是保留的罗售。但是history分成了注釋的,分離的有意義的commit钩述,由于這個原因寨躁,在一次merge commit中不會保留。
這就是為什么有些人不喜歡merge牙勘,喜歡rebase的原因职恳。

Rebase之美

與一籠統(tǒng)把commits塞到一個commit不同,一個rebase會保留原始的commits方面。
項目的歷史是一條單的放钦,直線。沒有任何跡象表明它在某個時候拆分出一個分支來恭金。

image

在一次rebase后最筒,看起來就像development從來沒有被拆分成不同的分支。

我們來一步一步拆分一個rebase操作蔚叨。方案很簡單:我們想用rebase集成branch-B到branch-A床蜘。


image

一個rebase之前的方案。

命令很簡單:

git rebase branch-B

首先蔑水,線條開始分支后邢锯,Git將"undo"所有的branch-A上的commits(在共同的祖提交后)。當(dāng)然搀别,它不會丟棄它們丹擎,而是臨時將它們存了起來。
[圖片上傳失敗...(image-cf01ca-1584858732388)]

其次歇父,它會應(yīng)用我們想集成的來自branch-B的commits蒂培。此使,兩個分支是相同的榜苫。


image

最后护戳,branch-A的新commits重新被應(yīng)用,但是在一個新的位置垂睬,在branch-B的后面媳荒。(they are rebased)。
結(jié)果就是development在一條直線上開發(fā)驹饺。不是一個commit包含了所有的改變钳枕,而是讓原始commit結(jié)構(gòu)保持原樣。


image

下面嘗試開BranchA赏壹,BranchB兩個分支鱼炒,然后基于webstorm的Version Control,觀察git rebase操作會不會有上述的變化蝌借。

BranchA


image

BranchB


image

Rebase BranchA onto branchB


image

其實就是將branchB的母分支branchA進行了integrate changes昔瞧,也就是把branchB的2次commit俐巴,放在共同的起點與branchA的新commit之間,或者也可以理解成將branchA的新commit硬爆,移動到了branchB的2次commits之后。

rebase的是誰擎鸠,就修改的是誰
onto的是誰缀磕,誰就是被rebase的分支的新commits

其實,rebase只做了一件事:更新base branch劣光!(重點袜蚕!重點!重點>钗小)

而想將誰的更新內(nèi)容作為新的base branch的提交牲剃,就將作為topicBranch。

非常重要的命令雄可。

git checkout baseBranch
git rebase topicBranch

再說的通俗一點凿傅,其實就是:挑了一個branch,把它的特性拿過來数苫,放在我的新特性之前聪舒。

Merging vs. Rebasing

看完上面這篇文章后,并沒有搞清楚rebase做了什么操作虐急,所以還是需要多讀一些文章箱残。

  • 對于初學(xué)者來說,git rebase命令就像一個magic voodoo
  • merge和rebase都是用來從一個分支到另一個分支integrate changes的止吁,只是方式不同

[圖片上傳失敗...(image-51ce99-1584858732389)]

Merge Option

git checkout feature
git merge master
git merge master feature

會有一個'merge commit', 但是merge是非常安全的被辑,不會像rebase有很多陷阱。
但是若master非尘吹耄活躍盼理,每次merge都會有要給'merge commit',會導(dǎo)致feature的commit history很臟俄删。
[圖片上傳失敗...(image-fa201e-1584858732389)]

Rebase Option

git checkout feature
git rebase master
  • feature從master tip處開始合并master上的commits

  • 重寫project的history
    [圖片上傳失敗...(image-946390-1584858732389)]

  • rebase后榜揖,project的history更加干凈了。沒了多余的'merge commit'抗蠢,并且成了一條線举哟。

  • rebase 需要遵循Golden Rule of Rebasing,否則會導(dǎo)致災(zāi)難性的合作workflow迅矛。

  • rebase 會丟失掉merge commit妨猩,導(dǎo)致看不到之后合并到feature的commit。

靈活一點的Rebasing

  • 選擇特定的commits移動到新分支秽褒,加一個i選項
  • fixup某一個提交
git checkout feature
git rebase -i master
pick 33d5b7a Message for commit #1
pick 9480b3d Message for commit #2
pick 5c67e61 Message for commit #3
pick 33d5b7a Message for commit #1
fixup 9480b3d Message for commit #2
pick 5c67e61 Message for commit #3

[圖片上傳失敗...(image-2711fa-1584858732389)]

Golden Rule of Rebasing

永遠(yuǎn)不要在public 分支上使用git rebase壶硅!

image

每次使用git rebase前威兜,問自己"有沒有人也正在基于這個branch寫代碼?"若是的話庐椒,就老老實實用merge椒舵,不要嘗試rebase。
若有g(shù)itflow的經(jīng)驗约谈,其實就是當(dāng)你開了一個feature/foo時笔宿,若同事也開了一個feature/bar关贵,而且你們是同時基于develop checkout出來的分支限寞,那么當(dāng)develop有hotfix merge進去時,若你想拉去最新的develop代碼厦酬,就不能用git rebase迈勋,只能用merge炬灭,否則會導(dǎo)致同事的develop分支與我們的develop分支不同,而此時她想再與我們保持同步是很復(fù)雜的靡菇。

Force-Pushing

若想將rebased的master分支推到遠(yuǎn)程倉庫重归,Git 將會阻止你,因為它與遠(yuǎn)程的master分支沖突了厦凤。但是提前,你可以force push。

# 這個命令一定要小心使用
git push --force
  • 只有100%確定自己在做什么時再force泳唠,否則會讓團隊的人很困惑
  • 若是想將某個feature遠(yuǎn)程分支徹底替換掉狈网,可以這樣做。

下面嘗試開master笨腥,feture兩個分支拓哺,然后基于webstorm的Version Control,觀察git rebase操作會不會有上述的變化脖母。

master


image

feature


image
git checkout feature
git rebase master
# resolve conflict1
git rebase --continue
# resolve confict2
git rebase --continue

Rebase feature onto master


image

webstorm 的 Rebase Current onto selected什么操作士鸥?

可以理解成下圖這樣。

Rebase feature onto master

image

[圖片上傳失敗...(image-aee717-1584858732389)]

Current在WebStorm中指右下角的branch谆级,selected一般指的original branch烤礁。

rebase and merge 一個Pull request做了什么操作?

image

相當(dāng)于:

git checkout feature
git rebase master

像下圖這樣:
[圖片上傳失敗...(image-512aa-1584858732389)]

image

實際工作中的rebase

一次完整的rebase流程

  1. git checkout feature
  2. git rebase master
  3. resolve conflicts
  4. git add .
  5. git rebase --continue

如果rebase中途出現(xiàn)問題肥照,可以使用git rebase --abort恢復(fù)脚仔。

git rebase的目的是保持當(dāng)前feature分支與master主分支同步的另一種方式,雖然與merge的效果相同舆绎,但是比merge更加簡潔高效鲤脏。

為什么說rebase比merge更加簡潔高效呢?

實際工作中的一個常見場景:在我們的feature開發(fā)期間,master上可能發(fā)布了很多release猎醇,修復(fù)了很多hotfix窥突。而且可能剛好影響到了我們目前開發(fā)的feature。此時我們需要將feature的代碼與master保持同步硫嘶。

同步有幾種方法:自己寫一遍阻问;merge;rebase沦疾。

  • 自己寫一遍
    自己寫一遍的方法是最不合理的称近,因為這會造成conflict,也是一種初學(xué)者容易犯的錯誤曹鸠。
  • merge
    稍微有經(jīng)驗一點的人,可以選擇merge斥铺,但是merge以后彻桃,我們在自己feature上提交的commit會被湮沒在茫茫commit中,很難清晰的從git history中找到晾蜘,這樣我們在開發(fā)過程中就很難清晰地知道上一次commit了哪些邻眷,最后合并到master上以后,如果出現(xiàn)bug追溯歷史commit也很困難剔交。
  • rebase
    最最明智的開發(fā)者肆饶,會使用rebase的話,解決完沖突之后岖常,就可以將我們feature上的commit全部移動到master的最新commit之后驯镊,這樣我們在開發(fā)過程中,就可以清晰地看到自己在feature上的commit竭鞍,發(fā)布功能之后板惑,也可以按照時間點去review我們的這幾次commit,從而快速找到問題偎快。

期待和大家交流冯乘,共同進步,歡迎大家加入我創(chuàng)建的與前端開發(fā)密切相關(guān)的技術(shù)討論小組:

努力成為優(yōu)秀前端工程師!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丐怯,一起剝皮案震驚了整個濱河市喷好,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌读跷,老刑警劉巖绒窑,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異舔亭,居然都是意外死亡些膨,警方通過查閱死者的電腦和手機蟀俊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來订雾,“玉大人肢预,你說我怎么就攤上這事⊥莅ィ” “怎么了烫映?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長噩峦。 經(jīng)常有香客問我锭沟,道長,這世上最難降的妖魔是什么识补? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任族淮,我火速辦了婚禮,結(jié)果婚禮上凭涂,老公的妹妹穿的比我還像新娘祝辣。我一直安慰自己,他們只是感情好切油,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布蝙斜。 她就那樣靜靜地躺著,像睡著了一般澎胡。 火紅的嫁衣襯著肌膚如雪孕荠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天攻谁,我揣著相機與錄音岛琼,去河邊找鬼。 笑死巢株,一個胖子當(dāng)著我的面吹牛槐瑞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播阁苞,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼困檩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了那槽?” 一聲冷哼從身側(cè)響起悼沿,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎骚灸,沒想到半個月后糟趾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年义郑,在試婚紗的時候發(fā)現(xiàn)自己被綠了蝶柿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡非驮,死狀恐怖交汤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情劫笙,我是刑警寧澤芙扎,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站填大,受9級特大地震影響戒洼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜允华,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一圈浇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧例获,春花似錦汉额、人聲如沸曹仗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怎茫。三九已至收壕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間轨蛤,已是汗流浹背蜜宪。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留祥山,地道東北人圃验。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像缝呕,于是被迫代替她去往敵國和親澳窑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容