分支的新建與合并

現(xiàn)在讓我們來(lái)看一個(gè)簡(jiǎn)單的分支與合并的例子,實(shí)際工作中大體也會(huì)用到這樣的工作流程:

開(kāi)發(fā)某個(gè)網(wǎng)站吃粒。
為實(shí)現(xiàn)某個(gè)新的需求锨络,創(chuàng)建一個(gè)分支赌躺。
在這個(gè)分支上開(kāi)展工作。
假設(shè)此時(shí)羡儿,你突然接到一個(gè)電話說(shuō)有個(gè)很?chē)?yán)重的問(wèn)題需要緊急修補(bǔ)礼患,那么可以按照下面的方式處理:

返回到原先已經(jīng)發(fā)布到生產(chǎn)服務(wù)器上的分支。
為這次緊急修補(bǔ)建立一個(gè)新分支失受,并在其中修復(fù)問(wèn)題讶泰。
通過(guò)測(cè)試后,回到生產(chǎn)服務(wù)器所在的分支拂到,將修補(bǔ)分支合并進(jìn)來(lái),然后再推送到生產(chǎn)服務(wù)器上码泞。
切換到之前實(shí)現(xiàn)新需求的分支兄旬,繼續(xù)工作。

分支的新建與切換

首先余寥,假設(shè)當(dāng)前的分支如下:

3-10

現(xiàn)在领铐,你決定要修補(bǔ)問(wèn)題追蹤系統(tǒng)上的 #53 問(wèn)題。順帶說(shuō)明下宋舷,Git 并不同任何特定的問(wèn)題追蹤系統(tǒng)打交道绪撵。這里為了說(shuō)明要解決的問(wèn)題,才把新建的分支取名為 iss53祝蝠。要新建并切換到該分支音诈,運(yùn)行 git checkout并加上 -b參數(shù):

$ git checkout -b iss53 switched to a new branch 'iss53'

這相當(dāng)于執(zhí)行下面的命令:
$ git branch isss53 $ git checkout iss53

3-11

接著你開(kāi)始嘗試修復(fù)問(wèn)題,在提交了若干次更新后绎狭,iss53分支的指針也會(huì)隨著向前推進(jìn)细溅,因?yàn)樗褪钱?dāng)前分支(換句話說(shuō),當(dāng)前的 HEAD指針指向 iss53儡嘶,如下):
$ vim index.html $ git commit -a -m 'added a new footer [issue 53]'

3-12

現(xiàn)在你就接到了那個(gè)網(wǎng)站問(wèn)題的緊急電話喇聊,需要馬上修補(bǔ)。有了 Git 蹦狂,我們就不需要同時(shí)發(fā)布這個(gè)補(bǔ)丁和iss53
里作出的修改誓篱,也不需要在創(chuàng)建和發(fā)布該補(bǔ)丁到服務(wù)器之前花費(fèi)大力氣來(lái)復(fù)原這些修改。唯一需要的僅僅是切換回 master分支凯楔。

不過(guò)在此之前窜骄,留心你的暫存區(qū)或者工作目錄里,那些還沒(méi)有提交的修改啼辣,它會(huì)和你即將檢出的分支產(chǎn)生沖突從而阻止 Git 為你切換分支啊研。切換分支的時(shí)候最好保持一個(gè)清潔的工作區(qū)域。稍后會(huì)介紹幾個(gè)繞過(guò)這種問(wèn)題的辦法(分別叫做 stashing 和 commit amending)。目前已經(jīng)提交了所有的修改党远,所以接下來(lái)可以正常轉(zhuǎn)換到 master分支:
$ git checkout master Switched to branch 'master'

此時(shí)工作目錄中的內(nèi)容和你在解決問(wèn)題 #53 之前一模一樣削解,你可以集中精力進(jìn)行緊急修補(bǔ)。這一點(diǎn)值得牢記:Git 會(huì)把工作目錄的內(nèi)容恢復(fù)為檢出某分支時(shí)它所指向的那個(gè)提交對(duì)象的快照沟娱。它會(huì)自動(dòng)添加氛驮、刪除和修改文件以確保目錄的內(nèi)容和你當(dāng)時(shí)提交時(shí)完全一樣。

接下來(lái)济似,你得進(jìn)行緊急修補(bǔ)矫废。我們創(chuàng)建一個(gè)緊急修補(bǔ)分支 hotfix來(lái)開(kāi)展工作,直到搞定(見(jiàn)圖 3-13)

$ git checkout -b hotfix Switched to a new branch 'hotfix' $ vim index.html $ git commit -a -m 'fixed the broken email address' [hotfix 3a0874c] fixed the broken email address 1 files changed, 1 deletion(-)

3-13

有必要作些測(cè)試砰蠢,確保修補(bǔ)是成功的蓖扑,然后回到 master
分支并把它合并進(jìn)來(lái),然后發(fā)布到生產(chǎn)服務(wù)器台舱。用 git merge命令來(lái)進(jìn)行合并:

$ git checkout master $ git merge hotfix Updating f42c576...3a0874c Fast-forward README | 1 - 1 file changed, 1 deletion(-)

請(qǐng)注意律杠,合并時(shí)出現(xiàn)了“Fast forward”的提示。由于當(dāng)前 master分支所在的提交對(duì)象是要并入的hotfix分支的直接上游竞惋,Git 只需把 master分支指針直接右移柜去。換句話說(shuō),如果順著一個(gè)分支走下去可以到達(dá)另一個(gè)分支的話拆宛,那么 Git 在合并兩者時(shí)嗓奢,只會(huì)簡(jiǎn)單地把指針右移,因?yàn)檫@種單線的歷史分支不存在任何需要解決的分歧浑厚,所以這種合并過(guò)程可以稱(chēng)為快進(jìn)(Fast forward)股耽。

現(xiàn)在最新的修改已經(jīng)在當(dāng)前 master分支所指向的提交對(duì)象中了,可以部署到生產(chǎn)服務(wù)器上去了(見(jiàn)圖 3-14)

3-14

在那個(gè)超級(jí)重要的修補(bǔ)發(fā)布以后瞻颂,你想要回到被打擾之前的工作豺谈。由于當(dāng)前 hotfix分支和 master都指向相同的提交對(duì)象,所以 hotfix已經(jīng)完成了歷史使命贡这,可以刪掉了茬末。使用 git branch-d選項(xiàng)執(zhí)行刪除操作:

$ git branch -d hotfix Deleted branch hotfix (was 3a0874c).

現(xiàn)在回到之前未完成的 #53 問(wèn)題修復(fù)分支上繼續(xù)工作(圖 3-15):

$ git checkout iss53 Switched to branch 'iss53' $ vim index.html $ git commit -a -m 'finished the new footer [issue 53]' [iss53 ad82d7a] finished the new footer [issue 53] 1 file changed, 1 insertion(+)

3-15

值得注意的是之前 hotfix分支的修改內(nèi)容尚未包含到 iss53中來(lái)。如果需要納入此次修補(bǔ)盖矫,可以用git merge mastermaster 分支合并到 iss53丽惭;或者等 iss53完成之后,再將 iss53 分支中的更新并入 master辈双。

分支的合并

在問(wèn)題 #53 相關(guān)的工作完成之后责掏,可以合并回 `master`
分支。實(shí)際操作同前面合并 `hotfix`分支差不多湃望,只需回到 `master`分支换衬,運(yùn)行 `git merge`命令指定要合并進(jìn)來(lái)的分支:

$ git checkout master $ git merge iss53 Auto-merging README Merge made by the 'recursive' strategy. README | 1 + 1 file changed, 1 insertion(+)

請(qǐng)注意痰驱,這次合并操作的底層實(shí)現(xiàn),并不同于之前 hotfix的并入方式瞳浦。因?yàn)檫@次你的開(kāi)發(fā)歷史是從更早的地方開(kāi)始分叉的担映。由于當(dāng)前 master分支所指向的提交對(duì)象(C4)并不是 iss53分支的直接祖先,Git 不得不進(jìn)行一些額外處理叫潦。就此例而言蝇完,Git 會(huì)用兩個(gè)分支的末端(C4 和 C5)以及它們的共同祖先(C2)進(jìn)行一次簡(jiǎn)單的三方合并計(jì)算。圖 3-16 用紅框標(biāo)出了 Git 用于合并的三個(gè)提交對(duì)象:

3-16

這次矗蕊,Git 沒(méi)有簡(jiǎn)單地把分支指針右移短蜕,而是對(duì)三方合并后的結(jié)果重新做一個(gè)新的快照,并自動(dòng)創(chuàng)建一個(gè)指向它的提交對(duì)象(C6)(見(jiàn)圖 3-17)傻咖。這個(gè)提交對(duì)象比較特殊朋魔,它有兩個(gè)祖先(C4 和 C5)。

值得一提的是 Git 可以自己裁決哪個(gè)共同祖先才是最佳合并基礎(chǔ)卿操;這和 CVS 或 Subversion(1.5 以后的版本)不同铺厨,它們需要開(kāi)發(fā)者手工指定合并基礎(chǔ)。所以此特性讓 Git 的合并操作比其他系統(tǒng)都要簡(jiǎn)單不少硬纤。

3-17

既然之前的工作成果已經(jīng)合并到 master了,那么 iss53
也就沒(méi)用了赃磨。你可以就此刪除它筝家,并在問(wèn)題追蹤系統(tǒng)里關(guān)閉該問(wèn)題。
$ git branch -d iss53

遇到?jīng)_突時(shí)的分支合并

有時(shí)候合并操作并不會(huì)如此順利邻辉。如果在不同的分支中都修改了同一個(gè)文件的同一部分溪王,Git 就無(wú)法干凈地把兩者合到一起(譯注:邏輯上說(shuō),這種問(wèn)題只能由人來(lái)裁決值骇。)莹菱。如果你在解決問(wèn)題 #53 的過(guò)程中修改了 hotfix中修改的部分,將得到類(lèi)似下面的結(jié)果:

$ git merge iss53 Auto-merging index.html CONFLICT (content): Merge conflict in index.html Automatic merge failed; fix conflicts and then commit the result.

Git 作了合并吱瘩,但沒(méi)有提交道伟,它會(huì)停下來(lái)等你解決沖突。要看看哪些文件在合并時(shí)發(fā)生沖突使碾,可以用 git status查閱:
`$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")

Unmerged paths:
(use "git add <file>..." to mark resolution)

both modified:    index.html

no changes added to commit (use "git add" and/or "git commit -a")`

任何包含未解決沖突的文件都會(huì)以未合并(unmerged)的狀態(tài)列出蜜徽。Git 會(huì)在有沖突的文件里加入標(biāo)準(zhǔn)的沖突解決標(biāo)記,可以通過(guò)它們來(lái)手工定位并解決這些沖突票摇【行可以看到此文件包含類(lèi)似下面這樣的部分:

<<<<< HEAD \<div id="footer">contact : email.support@github.com\</div\> \======= \<div id="footer"\> please contact us at support@github.com \</div\> \>>>>> iss53
可以看到 =======隔開(kāi)的上半部分,是 HEAD
(即 master分支矢门,在運(yùn)行 merge命令時(shí)所切換到的分支)中的內(nèi)容盆色,下半部分是在 iss53分支中的內(nèi)容灰蛙。解決沖突的辦法無(wú)非是二者選其一或者由你親自整合到一起。比如你可以通過(guò)把這段內(nèi)容替換為下面這樣來(lái)解決:

\<div id= "footer"> please contact us at email.support@github.com \</div\>

這個(gè)解決方案各采納了兩個(gè)分支中的一部分內(nèi)容隔躲,而且我還刪除了 <<<<<<<摩梧,=======>>>>>>> 這些行。在解決了所有文件里的所有沖突后蹭越,運(yùn)行 git add
將把它們標(biāo)記為已解決狀態(tài)(譯注:實(shí)際上就是來(lái)一次快照保存到暫存區(qū)域障本。)。因?yàn)橐坏捍嫦炀椋捅硎緵_突已經(jīng)解決驾霜。如果你想用一個(gè)有圖形界面的工具來(lái)解決這些問(wèn)題,不妨運(yùn)行 git mergetool买置,它會(huì)調(diào)用一個(gè)可視化的合并工具并引導(dǎo)你解決所有沖突:

如果想給將來(lái)看這次合并的人一些方便粪糙,可以修改該信息,提供更多合并細(xì)節(jié)忿项。比如你都作了哪些改動(dòng)蓉冈,以及這么做的原因。有時(shí)候裁決沖突的理由并不直接或明顯轩触,有必要略加注解寞酿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市脱柱,隨后出現(xiàn)的幾起案子伐弹,更是在濱河造成了極大的恐慌,老刑警劉巖榨为,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惨好,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡随闺,警方通過(guò)查閱死者的電腦和手機(jī)日川,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)矩乐,“玉大人龄句,你說(shuō)我怎么就攤上這事〈戮” “怎么了撒璧?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)笨使。 經(jīng)常有香客問(wèn)我卿樱,道長(zhǎng),這世上最難降的妖魔是什么硫椰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任繁调,我火速辦了婚禮萨蚕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蹄胰。我一直安慰自己岳遥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布裕寨。 她就那樣靜靜地躺著浩蓉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宾袜。 梳的紋絲不亂的頭發(fā)上捻艳,一...
    開(kāi)封第一講書(shū)人閱讀 50,096評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音庆猫,去河邊找鬼认轨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛月培,可吹牛的內(nèi)容都是我干的嘁字。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼杉畜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼纪蜒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起此叠,我...
    開(kāi)封第一講書(shū)人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤霍掺,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后拌蜘,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡牙丽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年简卧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烤芦。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡举娩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出构罗,到底是詐尸還是另有隱情铜涉,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布芒划,位于F島的核電站妄壶,受9級(jí)特大地震影響旭旭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纹烹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一页滚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧铺呵,春花似錦裹驰、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至音念,卻和暖如春沪饺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背症昏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工随闽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肝谭。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓掘宪,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親攘烛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子魏滚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

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

  • 分支的新建與合并 讓我們來(lái)看一個(gè)簡(jiǎn)單的分支新建與分支合并的例子,實(shí)際工作中你可能會(huì)用到類(lèi)似的工作流坟漱。 你將經(jīng)歷如下...
    vb12閱讀 728評(píng)論 0 0
  • 3.2 Git 分支 - 分支的新建與合并 分支的新建與合并 讓我們來(lái)看一個(gè)簡(jiǎn)單的分支新建與分支合并的例子鼠次,實(shí)際工...
    Crisewng閱讀 526評(píng)論 0 0
  • 讓我們來(lái)看一個(gè)簡(jiǎn)單的分支新建與分支合并的例子,實(shí)際工作中你可能會(huì)用到類(lèi)似的工作流芋齿。 你將經(jīng)歷如下步驟:1.開(kāi)發(fā)某個(gè)...
    我相信你愛(ài)過(guò)gg閱讀 240評(píng)論 0 0
  • 純手工打造每一篇開(kāi)源資訊與技術(shù)干貨觅捆,數(shù)十萬(wàn)程序員和Linuxer已經(jīng)關(guān)注 1 Git 分支 - 分支簡(jiǎn)介 有人把 ...
    塵世不擾閱讀 701評(píng)論 0 3
  • 你是否找到了人生的方向呢 你是否想擁有全方位幸福的人生呢 你是否想學(xué)會(huì)溝通說(shuō)服力呢 你是否希望學(xué)到把話說(shuō)出去赦役,把錢(qián)...
    游亞瑟閱讀 2,756評(píng)論 0 0