Git (13) -- Git 分支 -- 分支的新建與合并

@[TOC]

讓我們來看一個(gè)簡單的分支新建與分支合并的例子秘车,實(shí)際工作中你可能會用到類似的工作流典勇。 你將經(jīng)歷如下步驟:

  1. 開發(fā)某個(gè)網(wǎng)站。
  2. 為實(shí)現(xiàn)某個(gè)新的用戶需求叮趴,創(chuàng)建一個(gè)分支割笙。
  3. 在這個(gè)分支上開展工作。

正在此時(shí)眯亦,你突然接到一個(gè)電話說有個(gè)很嚴(yán)重的問題需要緊急修補(bǔ)伤溉。 你將按照如下方式來處理:

  1. 切換到你的線上分支(production branch)。
  2. 為這個(gè)緊急任務(wù)新建一個(gè)分支妻率,并在其中修復(fù)它乱顾。
  3. 在測試通過之后,切換回線上分支宫静,然后合并這個(gè)修補(bǔ)分支走净,最后將改動(dòng)推送到線上分支。
  4. 切換回你最初工作的分支上孤里,繼續(xù)工作伏伯。

0、準(zhǔn)備工作

新建Repository

在這里插入圖片描述

clone到本地:
在這里插入圖片描述

進(jìn)入倉庫目錄捌袜,查看提交記錄:
在這里插入圖片描述

新建測試文件说搅,add到暫存區(qū):
在這里插入圖片描述

第二次提交(新建倉庫時(shí)自動(dòng)提交第一次),查看提交記錄:
在這里插入圖片描述

修改測試文件虏等,第三次提交:
在這里插入圖片描述

1弄唧、新建分支

此時(shí)在 main 分支上已經(jīng)有了一些提交。

一個(gè)簡單提交歷史:

在這里插入圖片描述

現(xiàn)在要解決公司使用的問題追蹤系統(tǒng)中的 #53 問題博其。 想要新建一個(gè)分支并同時(shí)切換到那個(gè)分支上套才,你可以運(yùn)行一個(gè)帶有 -b 參數(shù)的 git checkout 命令:

$ git checkout -b iss53
Switched to a new branch "iss53"

它是下面兩條命令的簡寫:

$ git branch iss53
$ git checkout iss53
在這里插入圖片描述
創(chuàng)建一個(gè)新分支指針:
在這里插入圖片描述

這時(shí)繼續(xù)在 #53 問題上工作,并且做了一些提交慕淡。 在此過程中背伴,iss53 分支在不斷的向前推進(jìn),因?yàn)槟阋呀?jīng)檢出到該分支 (也就是說峰髓,你的 HEAD 指針指向了 iss53 分支)

新建index.html傻寂,編輯并添加到暫存區(qū),issue53分支第一次提交:

在這里插入圖片描述

iss53 分支隨著工作的進(jìn)展向前推進(jìn):

在這里插入圖片描述

現(xiàn)在你接到那個(gè)電話携兵,有個(gè)緊急問題等待你來解決疾掰。 有了 Git 的幫助,你不必把這個(gè)緊急問題和 iss53 的修改混在一起徐紧, 你也不需要花大力氣來還原關(guān)于 53# 問題的修改静檬,然后再添加關(guān)于這個(gè)緊急問題的修改炭懊,最后將這個(gè)修改提交到線上分支。 你所要做的僅僅是切換回 main 分支拂檩。

但是侮腹,在你這么做之前,要留意你的工作目錄和暫存區(qū)里那些還沒有被提交的修改稻励, 它可能會和你即將檢出的分支產(chǎn)生沖突從而阻止 Git 切換到該分支父阻。 最好的方法是,在你切換分支之前望抽,保持好一個(gè)干凈的狀態(tài)加矛。 有一些方法可以繞過這個(gè)問題(即,暫存(stashing)修補(bǔ)提交(commit amending))煤篙。 現(xiàn)在斟览,我們假設(shè)你已經(jīng)把你的修改全部提交了,這時(shí)你可以切換回 main 分支了:

$ git checkout main
Switched to branch 'main'

在這里插入圖片描述

這個(gè)時(shí)候舰蟆,你的工作目錄和你在開始 #53 問題之前一模一樣趣惠,現(xiàn)在你可以專心修復(fù)緊急問題了。 請牢記:當(dāng)你切換分支的時(shí)候身害,Git 會重置你的工作目錄味悄,使其看起來像回到了你在那個(gè)分支上最后一次提交的樣子。 Git 會自動(dòng)添加塌鸯、刪除侍瑟、修改文件以確保此時(shí)你的工作目錄和這個(gè)分支最后一次提交時(shí)的樣子一模一樣。

接下來丙猬,你要修復(fù)這個(gè)緊急問題涨颜。 我們來建立一個(gè) hotfix 分支,在該分支上工作直到問題解決:

在這里插入圖片描述
在這里插入圖片描述
基于 main 分支的緊急問題分支 hotfix branch
在這里插入圖片描述

你可以運(yùn)行你的測試茧球,確保你的修改是正確的庭瑰,然后將 hotfix 分支合并回你的 main 分支來部署到線上。 你可以使用 git merge 命令來達(dá)到上述目的:

在這里插入圖片描述

在合并的時(shí)候抢埋,你應(yīng)該注意到了“快進(jìn)(fast-forward)”這個(gè)詞弹灭。 由于你想要合并的分支 hotfix 所指向的提交 C5 是你所在的提交 C3 的直接后繼, 因此 Git 會直接將指針向前移動(dòng)揪垄。換句話說穷吮,當(dāng)你試圖合并兩個(gè)分支時(shí), 如果順著一個(gè)分支走下去能夠到達(dá)另一個(gè)分支饥努,那么 Git 在合并兩者的時(shí)候捡鱼, 只會簡單的將指針向前推進(jìn)(指針右移),因?yàn)檫@種情況下的合并操作沒有需要解決的分歧——這就叫做 “快進(jìn)(fast-forward)”酷愧。

在這里插入圖片描述

現(xiàn)在驾诈,最新的修改已經(jīng)在 main 分支所指向的提交快照中缠诅,你可以著手發(fā)布該修復(fù)了。

main 被快進(jìn)到 hotfix
在這里插入圖片描述

關(guān)于這個(gè)緊急問題的解決方案發(fā)布之后乍迄,你準(zhǔn)備回到被打斷之前時(shí)的工作中滴铅。 然而,你應(yīng)該先刪除 hotfix 分支就乓,因?yàn)槟阋呀?jīng)不再需要它了 —— main 分支已經(jīng)指向了同一個(gè)位置。 你可以使用帶 -d 選項(xiàng)的 git branch 命令來刪除分支:

在這里插入圖片描述

現(xiàn)在你可以切換回你正在工作的分支繼續(xù)你的工作拱烁,也就是針對 #53 問題的那個(gè)分支(iss53 分支)生蚁。

在這里插入圖片描述
在這里插入圖片描述
繼續(xù)在 iss53 分支上的工作:

在這里插入圖片描述

你在 hotfix 分支上所做的工作并沒有包含到 iss53 分支中。 如果你需要拉取 hotfix 所做的修改戏自,你可以使用 git merge main 命令將 main 分支合并入 iss53 分支邦投,或者你也可以等到 iss53 分支完成其使命,再將其合并回 main 分支擅笔。

2志衣、分支的合并

假設(shè)你已經(jīng)修正了 #53 問題,并且打算將你的工作合并入 main 分支猛们。 為此念脯,你需要合并 iss53 分支到 main 分支,這和之前你合并 hotfix 分支所做的工作差不多弯淘。 你只需要檢出到你想合并入的分支绿店,然后運(yùn)行 git merge 命令:

在這里插入圖片描述

這和你之前合并 hotfix 分支的時(shí)候看起來有一點(diǎn)不一樣。 在這種情況下庐橙,你的開發(fā)歷史從一個(gè)更早的地方開始分叉開來(diverged)假勿。 因?yàn)椋?code>main 分支所在提交并不是 iss53 分支所在提交的直接祖先,Git 不得不做一些額外的工作态鳖。 出現(xiàn)這種情況的時(shí)候转培,Git 會使用兩個(gè)分支的末端所指的快照(C5C6)以及這兩個(gè)分支的公共祖先(C3),做一個(gè)簡單的三方合并浆竭。

一次典型合并中所用到的三個(gè)快照:

在這里插入圖片描述

和之前將分支指針向前推進(jìn)所不同的是浸须,Git 將此次三方合并的結(jié)果做了一個(gè)新的快照并且自動(dòng)創(chuàng)建一個(gè)新的提交指向它。 這個(gè)被稱作一次合并提交兆蕉,它的特別之處在于他有不止一個(gè)父提交羽戒。

一個(gè)合并提交:


在這里插入圖片描述

既然你的修改已經(jīng)合并進(jìn)來了,就不再需要 iss53 分支了虎韵。 現(xiàn)在你可以在任務(wù)追蹤系統(tǒng)中關(guān)閉此項(xiàng)任務(wù)戈抄,并刪除這個(gè)分支拇泣。

$ git branch -d iss53

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

有時(shí)候合并操作不會如此順利斩箫。 如果你在兩個(gè)不同的分支中,對同一個(gè)文件的同一個(gè)部分進(jìn)行了不同的修改和簸,Git 就沒法干凈的合并它們。 如果你對 #53 問題的修改和有關(guān) hotfix 分支的修改都涉及到同一個(gè)文件的同一處,在合并它們的時(shí)候就會產(chǎn)生合并沖突:

在這里插入圖片描述
在這里插入圖片描述

此時(shí) Git 做了合并届巩,但是沒有自動(dòng)地創(chuàng)建一個(gè)新的合并提交。 Git 會暫停下來份乒,等待你去解決合并產(chǎn)生的沖突恕汇。 你可以在合并沖突后的任意時(shí)刻使用 git status 命令來查看那些因包含合并沖突而處于未合并(unmerged)狀態(tài)的文件:

在這里插入圖片描述

任何因包含合并沖突而有待解決的文件,都會以未合并狀態(tài)標(biāo)識出來或辖。 Git 會在有沖突的文件中加入標(biāo)準(zhǔn)的沖突解決標(biāo)記瘾英,這樣你可以打開這些包含沖突的文件然后手動(dòng)解決沖突。 出現(xiàn)沖突的文件會包含一些特殊區(qū)段颂暇,看起來像下面這個(gè)樣子:

在這里插入圖片描述

在這里插入圖片描述

這表示 HEAD 所指示的版本(也就是你的 main 分支所在的位置缺谴,因?yàn)槟阍谶\(yùn)行 merge 命令的時(shí)候已經(jīng)檢出到了這個(gè)分支)在這個(gè)區(qū)段的上半部分(======= 的上半部分),而 iss53 分支所指示的版本在 ======= 的下半部分耳鸯。 為了解決沖突湿蛔,你必須選擇使用由 ======= 分割的兩部分中的一個(gè),或者你也可以自行合并這些內(nèi)容县爬。 例如阳啥,你可以通過把這段內(nèi)容換成下面的樣子來解決沖突:
在這里插入圖片描述

上述的沖突解決方案僅保留了其中一個(gè)分支的修改,并且 <<<<<<<,=======, 和>>>>>>> 這些行被完全刪除了财喳。 在你解決了所有文件里的沖突之后苫纤,對每個(gè)文件使用 git add 命令來將其標(biāo)記為沖突已解決。 一旦暫存這些原本有沖突的文件纲缓,Git 就會將它們標(biāo)記為沖突已解決卷拘。

在這里插入圖片描述

如果你想使用圖形化工具來解決沖突,你可以運(yùn)行 git mergetool祝高,該命令會為你啟動(dòng)一個(gè)合適的可視化合并工具栗弟,并帶領(lǐng)你一步一步解決這些沖突:

在這里插入圖片描述

在這里插入圖片描述

如果你想使用除默認(rèn)工具(在這里 Git 使用 opendiff 做為默認(rèn)的合并工具) 外的其他合并工具,你可以在 “下列工具中(one of the following tools)” 這句后面看到所有支持的合并工具工闺。 然后輸入你喜歡的工具名字就可以了乍赫。

點(diǎn)enter

[圖片上傳失敗...(image-d46f98-1630452954675)]

在這里插入圖片描述
$ git mergetool

This message is displayed because 'merge.tool' is not configured.
See 'git mergetool --tool-help' or 'git help config' for more details.
'git mergetool' will now attempt to use one of the following tools:
opendiff kdiff3 tkdiff xxdiff meld tortoisemerge gvimdiff diffuse diffmerge ecmerge p4merge araxis bc codecompare smerge emerge vimdiff nvimdiff
Merging:
README.md

Normal merge conflict for 'README.md':
  {local}: modified file
  {remote}: modified file
Hit return to start merge resolution tool (vimdiff):
4 files to edit

等你退出合并工具之后,Git 會詢問剛才的合并是否成功陆蟆。 如果你回答是雷厂,Git 會暫存那些文件以表明沖突已解決: 你可以再次運(yùn)行 git status 來確認(rèn)所有的合并沖突都已被解決:

在這里插入圖片描述

如果你對結(jié)果感到滿意,并且確定之前有沖突的的文件都已經(jīng)暫存了叠殷,這時(shí)你可以輸入 git commit 來完成合并提交改鲫。 默認(rèn)情況下提交信息看起來像下面這個(gè)樣子:

在這里插入圖片描述

如果你覺得上述的信息不夠充分,不能完全體現(xiàn)分支合并的過程,你可以修改上述信息像棘, 添加一些細(xì)節(jié)給未來檢視這個(gè)合并的讀者一些幫助稽亏,告訴他們你是如何解決合并沖突的,以及理由是什么缕题。

在這里插入圖片描述

既然你的修改已經(jīng)合并進(jìn)來了截歉,就不再需要 iss53 分支了。 現(xiàn)在你可以在任務(wù)追蹤系統(tǒng)中關(guān)閉此項(xiàng)任務(wù)烟零,并刪除這個(gè)分支瘪松。

$ git branch -d iss53
在這里插入圖片描述
在這里插入圖片描述

zan.gif
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市锨阿,隨后出現(xiàn)的幾起案子凉逛,更是在濱河造成了極大的恐慌,老刑警劉巖群井,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異毫胜,居然都是意外死亡书斜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門酵使,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荐吉,“玉大人,你說我怎么就攤上這事口渔⊙溃” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵缺脉,是天一觀的道長痪欲。 經(jīng)常有香客問我,道長攻礼,這世上最難降的妖魔是什么业踢? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮礁扮,結(jié)果婚禮上知举,老公的妹妹穿的比我還像新娘。我一直安慰自己太伊,他們只是感情好雇锡,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著僚焦,像睡著了一般锰提。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天欲账,我揣著相機(jī)與錄音屡江,去河邊找鬼。 笑死赛不,一個(gè)胖子當(dāng)著我的面吹牛惩嘉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播踢故,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼文黎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了殿较?” 一聲冷哼從身側(cè)響起耸峭,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎淋纲,沒想到半個(gè)月后劳闹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洽瞬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年本涕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伙窃。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡菩颖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出为障,到底是詐尸還是另有隱情晦闰,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布鳍怨,位于F島的核電站呻右,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鞋喇。R本人自食惡果不足惜窿冯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望确徙。 院中可真熱鬧醒串,春花似錦、人聲如沸鄙皇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伴逸。三九已至缠沈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洲愤。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工颓芭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柬赐。 一個(gè)月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓亡问,卻偏偏與公主長得像,于是被迫代替她去往敵國和親肛宋。 傳聞我的和親對象是個(gè)殘疾皇子州藕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

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

  • 分支的新建與合并 需求如下: 讓我們來看一個(gè)簡單的分支新建與分支合并的例子,實(shí)際工作中你可能會用到類似的工作流酝陈。 ...
    三少爺_賤閱讀 375評論 2 2
  • 分支的新建與合并 讓我們來看一個(gè)簡單的分支新建與分支合并的例子床玻,實(shí)際工作中你可能會用到類似的工作流。 你將經(jīng)歷如下...
    vb12閱讀 731評論 0 0
  • 3.2 Git 分支 - 分支的新建與合并 分支的新建與合并 讓我們來看一個(gè)簡單的分支新建與分支合并的例子沉帮,實(shí)際工...
    旅行者xy閱讀 1,032評論 0 6
  • 做個(gè)筆記https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF...
    未聞椛洺閱讀 269評論 0 0
  • 3.2 Git 分支 - 分支的新建與合并 分支的新建與合并 讓我們來看一個(gè)簡單的分支新建與分支合并的例子锈死,實(shí)際工...
    Crisewng閱讀 552評論 0 0