git 合并代碼之--merge、rebase

git最常用方法之一帐要,合并代碼把敞,大部分時(shí)候我們都是使用merge命令。其實(shí)還有rebase命令榨惠,既然都是合并代碼奋早,兩者有什么差異和共同點(diǎn)盛霎?
那就來深入了解一下

1.相同點(diǎn)

雖然git合并代碼有merge和rebase兩種方式,但是兩種合并方式的最終結(jié)果是一樣的耽装,沒有任何區(qū)別愤炸。

既然整合結(jié)果沒有區(qū)別,那么區(qū)別在哪了掉奄?那就是合并過程规个。

2.不同點(diǎn)

以兩個(gè)分支為例,主分支master姓建,新分支develop诞仓,將develop分支合并到master主分支

2.1. merge合并

//當(dāng)前處于master分支
daideMacBook-Pro:UIFinalTest dai$ git status
On branch master
Your branch is ahead of 'github/master' by 5 commits.
  (use "git push" to publish your local commits)

//創(chuàng)建并切換到develop分支
nothing to commit, working tree clean
daideMacBook-Pro:UIFinalTest dai$ git checkout -b develop
Switched to a new branch 'develop'

//創(chuàng)建一個(gè)類,添加到develop倉庫
daideMacBook-Pro:UIFinalTest dai$ git add .
daideMacBook-Pro:UIFinalTest dai$ git commit -m'Develop1'
[develop 905f008] Develop1
 Committer: dai <dai@daideMacBook-Pro.local>

//切換到master分支,并添加一個(gè)類到master倉庫
daideMacBook-Pro:UIFinalTest dai$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'github/master' by 5 commits.
  (use "git push" to publish your local commits)
daideMacBook-Pro:UIFinalTest dai$ git add .
daideMacBook-Pro:UIFinalTest dai$ git commit -m'Master1'
[master 4d82b67] Master1
 Committer: dai <dai@daideMacBook-Pro.local>

//再次添加一個(gè)類到master倉庫
daideMacBook-Pro:UIFinalTest dai$ git add .
daideMacBook-Pro:UIFinalTest dai$ git commit -m'Master2'
[master 3a2c545] Master2
 Committer: dai <dai@daideMacBook-Pro.local>

//最后速兔,再回到develop分支墅拭,添加一個(gè)類到develop倉庫
daideMacBook-Pro:UIFinalTest dai$ git checkout develop
Switched to branch 'develop'
daideMacBook-Pro:UIFinalTest dai$ git add .
daideMacBook-Pro:UIFinalTest dai$ git commit -m'Develop2'
[develop 78d53bf] Develop2
 Committer: dai <dai@daideMacBook-Pro.local>

因?yàn)閙aster和develop的父分支是一樣的,都是base涣狗,所以具體流程如下:
master: base <--- Master1 <--- Master2
develop: base <--- Develop1 <--- Develop2

image.png

合并代碼:

//先切換到master分支谍婉,使用git merge develop命令
daideMacBook-Pro:UIFinalTest dai$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'github/master' by 7 commits.
  (use "git push" to publish your local commits)
daideMacBook-Pro:UIFinalTest dai$ git merge develop

因?yàn)槭褂胢erge命令是按照時(shí)間戳先后順序的,所以镀钓,得到的提交歷史為:
base <--- Develop1 <--- Master1 <--- Master2 <---Develop1 <--- Merge(做了三方合并發(fā)現(xiàn)沖突穗熬,手工處理沖突后git add/commit增加了提交節(jié)點(diǎn)Merge)


image.png

2.2 rebase合并

分支創(chuàng)建同上,但是在合并代碼時(shí)掸宛,不需要切換到master分支

合并代碼:

daideMacBook-Pro:UIFinalTest dai$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: Develop1
Applying: Develop2

  • 1:回到兩個(gè)分支(master死陆、develop)的共同祖先(base),

  • 2:提取你所在分支(develop)每次提交時(shí)產(chǎn)生的差異唧瘾,

  • 3:把這些差異分別保存到臨時(shí)文件里措译,

  • 4:然后從當(dāng)前分支(develop)轉(zhuǎn)換到你需要衍合的分支(master),

  • 5:依照順序把分支master的差異commit放到分支feature-1中饰序。

合并后的 Develop2(即現(xiàn)在的 Develop2`)所指的快照领虹,同上面Merge三方合并例子中的 Merge所指的快照內(nèi)容一模一樣了。最后整合得到的結(jié)果沒有任何區(qū)別求豫,但衍合能產(chǎn)生一個(gè)更為整潔的提交歷史塌衰。如果視察一個(gè)衍合過的分支的歷史記錄,看起來更清楚: 仿佛所有修改都是先后進(jìn)行的蝠嘉,盡管實(shí)際上它們原來是同時(shí)發(fā)生的最疆。


總結(jié)

git rebase過程相比較git merge合并整合得到的結(jié)果沒有任何區(qū)別,但是通過git rebase衍合能產(chǎn)生一個(gè)更為整潔的提交歷史蚤告。
如果觀察一個(gè)衍合過的分支的歷史提交記錄努酸,看起來會更清楚:仿佛所有修改都是在一根線上先后完成的,盡管實(shí)際上它們原來是同時(shí)并行發(fā)生的杜恰。

一般我們使用衍合的目的获诈,是想要得到一個(gè)能在遠(yuǎn)程分支上干凈應(yīng)用的補(bǔ)丁仍源,比如某個(gè)項(xiàng)目你不是維護(hù)者,但是想幫點(diǎn)忙舔涎,最好使用衍合處理笼踩。
先在自己的一個(gè)分支進(jìn)行開發(fā),當(dāng)準(zhǔn)備向主項(xiàng)目提交補(bǔ)丁的時(shí)候亡嫌,根據(jù)最新的orgin/master進(jìn)行一次衍合操作然后再提交嚎于,這樣維護(hù)者就不需要任何整合工作。

實(shí)際為:把解決分支補(bǔ)丁同最新主干代碼之間的沖突的責(zé)任昼伴,劃轉(zhuǎn)給由提交補(bǔ)丁的人來解決匾旭。
作為維護(hù)項(xiàng)目的人只需要根據(jù)你提供的倉庫地址做一次快進(jìn)合并,或者直接采納你提交的補(bǔ)丁圃郊。

衍合的風(fēng)險(xiǎn)价涝,請務(wù)必遵循如下準(zhǔn)則:
一旦分支中的提交對象發(fā)布到公共倉庫,就千萬不要對該分支進(jìn)行衍合操作持舆。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末色瘩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子逸寓,更是在濱河造成了極大的恐慌居兆,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竹伸,死亡現(xiàn)場離奇詭異泥栖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)勋篓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門吧享,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人譬嚣,你說我怎么就攤上這事钢颂。” “怎么了拜银?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵殊鞭,是天一觀的道長。 經(jīng)常有香客問我尼桶,道長操灿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任泵督,我火速辦了婚禮牲尺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己谤碳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布溢豆。 她就那樣靜靜地躺著蜒简,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漩仙。 梳的紋絲不亂的頭發(fā)上搓茬,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機(jī)與錄音队他,去河邊找鬼卷仑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛麸折,可吹牛的內(nèi)容都是我干的锡凝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼垢啼,長吁一口氣:“原來是場噩夢啊……” “哼窜锯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起芭析,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤锚扎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后馁启,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驾孔,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年惯疙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了翠勉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡螟碎,死狀恐怖眉菱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掉分,我是刑警寧澤俭缓,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站酥郭,受9級特大地震影響华坦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜不从,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一惜姐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦歹袁、人聲如沸坷衍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枫耳。三九已至,卻和暖如春孟抗,著一層夾襖步出監(jiān)牢的瞬間迁杨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工凄硼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留螺垢,地道東北人缨硝。 一個(gè)月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓芋簿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親预皇。 傳聞我的和親對象是個(gè)殘疾皇子婉刀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

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