【學了就忘】Git分支 — 45.分支合并(快進合并)

開發(fā)一個版本涉兽,采用的發(fā)布流程:

  1. master分支的最新代碼拉取一個開發(fā)分支深碱,在上面進行開發(fā)(這里假設(shè)開發(fā)分支為dev)嗤谚。
  2. dev分支上不斷地進行提交版本棺蛛,期間master分支也會有因為其他版本上線,而不停有版本合并到master分支上巩步。
  3. dev分支要測試發(fā)布的時候旁赊,要把master分支的代碼,先合并到dev分支上椅野。
  4. 最后發(fā)布完成后终畅,再把dev分支的代碼合并到master分支上。

1竟闪、分支合并說明

dev分支上的工作完成后离福,需要將其合并到主分支master上。合并過程其實很快炼蛤,只需要將master指針指向dev指針指向的節(jié)點妖爷,然后再將HEAD指針指向master指針指向的節(jié)點即可。即分支的合并就是修改了兩個指針的指向而已理朋。

對于合并的較形象的理解是:合并就是將原來在dev分支上的節(jié)點絮识,全部投射到master分支上绿聘。

合并分支命令:git merge

對于分支的合并需要注意:如果需要將分支B合并到分支A上次舌,首先要將當前分支切換到A分支上熄攘,然后再運行合并命令。

2垃它、綜合示例

讓我們來看一個簡單的分支新建與分支合并的例子鲜屏,實際工作中你可能會用到類似的工作流程。

例如:

  1. 開發(fā)某個網(wǎng)站国拇。
  2. 為實現(xiàn)某個新的用戶需求洛史,創(chuàng)建一個分支。
  3. 在這個分支上開展工作酱吝。

正在此時也殖,你突然接到一個電話說有個很嚴重的問題需要緊急修補。

你將按照如下方式來處理:

  1. 切換到主分支(production branch)或者開發(fā)分支上务热。
  2. 為這個緊急任務(wù)新建一個分支忆嗜,并在其中修復它。
  3. 在測試通過之后崎岂,切換回線上分支捆毫,然后合并這個修補分支,最后將改動推送到線上分支冲甘。
  4. 切換回你最初工作的分支上绩卤,繼續(xù)工作。

(1)正常工作情況說明

1)主分支情況

首先江醇,你正在項目上工作濒憋,并且在 master 分支上已經(jīng)有了一些提交。

如下:項目中已經(jīng)有三次提交

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git log --oneline
b97ccfd (HEAD -> master) 第3次提交陶夜,新增內(nèi)容:branch test v3
f72a9fe 第2次提交凛驮,新增內(nèi)容:branch test v2
fa2439a 第1次提交,新增readme.txt文件

圖解如下:

2)我的開發(fā)分支情況

為實現(xiàn)某個新的用戶需求条辟,創(chuàng)建一個分支黔夭,正在開發(fā)中,比如dev分支羽嫡。

# 1.創(chuàng)建dev分支
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git checkout -b dev
Switched to a new branch 'dev'

# 2.進行開發(fā)工作
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (dev)
$ echo 'dev new file v1' > dev.txt

圖解如下:

因為你已經(jīng)切換到該分支進行開發(fā)了纠修,也就是說,你的 HEAD 指針指向了 dev 分支厂僧。

(2)突然要處理新任務(wù)

現(xiàn)在你接到那個電話扣草,有個緊急問題等待你來解決。

1)結(jié)束正在開發(fā)的任務(wù),并提交到版本庫中

# 1.把dev分支中開發(fā)的文件提交到暫存區(qū)中
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (dev)
$ git add ./
warning: LF will be replaced by CRLF in dev.txt.
The file will have its original line endings in your working directory

# 2.然后提交到本地版本庫中
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (dev)
$ git commit -m '第4次提交辰妙,dev分支開發(fā) dev.txt文件'
[dev 9eb3224] 第4次提交鹰祸,dev分支開發(fā) dev.txt文件
 1 file changed, 1 insertion(+)
 create mode 100644 dev.txt

# 3.查看歷史提交記錄
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (dev)
$ git log --oneline --graph
* 9eb3224 (HEAD -> dev) 第4次提交,dev分支開發(fā) dev.txt文件
* b97ccfd (master) 第3次提交密浑,新增內(nèi)容:branch test v3
* f72a9fe 第2次提交蛙婴,新增內(nèi)容:branch test v2
* fa2439a 第1次提交,新增readme.txt文件

此時工作目錄中圖解如下:

注意:在你這么做之前進行切換分支之前尔破, 最好的方法是保持好一個干凈的狀態(tài)工作目錄街图。

否則可能出現(xiàn):

  • 切換分支失敗。
  • 或者分支污染懒构。

2)切換到master分支上

# 1.查看dev分支工作目錄文件狀態(tài)餐济,干凈的。
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (dev)
$ git status
On branch dev
nothing to commit, working tree clean

# 2.切換到master分支上
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (dev)
$ git checkout master
Switched to branch 'master'

3)在master分支上創(chuàng)建修復分支

這個時候胆剧,你的工作目錄將恢復到你在開發(fā)dev分支之前的模樣絮姆,現(xiàn)在你可以專心修復緊急問題了。(那份代碼出現(xiàn)問題了秩霍,就從哪個代碼上開分支)

提示:當你切換分支的時候篙悯,Git 會重置你的工作目錄, Git 會自動添加铃绒、刪除鸽照、修改文件,以確保此時你的工作目錄和這個分支最后一次提交時的樣子一模一樣颠悬。

接下來移宅,你要修復這個緊急問題。 我們來建立一個 hotfix 分支椿疗,在該分支上工作直到問題解決:

# 1.創(chuàng)建修復分支hotfix
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (dev)
$ git checkout -b hotfix
Switched to a new branch 'hotfix'

# 2.進行修復,增加V4版本
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (hotfix)
$ echo 'branch test v4' >> readme.txt

# 3.提交到本地版本庫
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (hotfix)
$ git commit -a -m '第5次提交糠悼,新增內(nèi)容:branch test v4'
[hotfix 0690030] 第5次提交届榄,新增內(nèi)容:branch test v4
 Date: Sat Apr 17 18:29:35 2021 +0800
 1 file changed, 1 insertion(+)

# 4.查看本地庫克歷史提交信息
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (hotfix)
$ git log --oneline --graph --all
* 0690030 (HEAD -> hotfix) 第5次提交,新增內(nèi)容:branch test v4
| * 9eb3224 (dev) 第4次提交倔喂,dev分支開發(fā) dev.txt文件
|/
* b97ccfd (master) 第3次提交铝条,新增內(nèi)容:branch test v3
* f72a9fe 第2次提交,新增內(nèi)容:branch test v2
* fa2439a 第1次提交席噩,新增readme.txt文件

此時工作目錄中圖解如下:

接下來可以運行測試你的修復班缰,確保修改是正確的后,將 hotfix 分支合并回 master 分支悼枢,并部署到線上埠忘。

4)將 hotfix 分支合并到 master 分支上

你可以使用 git merge 命令來達到上述目的:

# 1.查看工作目錄中文件狀態(tài),非常干凈
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (hotfix)
$ git status
On branch hotfix
nothing to commit, working tree clean

# 2.切換到master分支
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (hotfix)
$ git checkout master
Switched to branch 'master'

# 3.查看是否切換到主分支上
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git branch
  dev
  hotfix
* master

# 4.合并hotfix分支到master分支
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git merge hotfix
Updating b97ccfd..0690030
Fast-forward
 readme.txt | 1 +
 1 file changed, 1 insertion(+)

# 5.查看版本庫歷史提交記錄
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git log --oneline --graph --all
* 0690030 (HEAD -> master, hotfix) 第5次提交,新增內(nèi)容:branch test v4
| * 9eb3224 (dev) 第4次提交莹妒,dev分支開發(fā) dev.txt文件
|/
* b97ccfd 第3次提交名船,新增內(nèi)容:branch test v3
* f72a9fe 第2次提交,新增內(nèi)容:branch test v2
* fa2439a 第1次提交旨怠,新增readme.txt文件
# 發(fā)現(xiàn)HEAD -> master, hotfix,說明此時master, hotfix分支合并了渠驼。

此時工作目錄中圖解如下:

在合并的時候,你應該注意到了“快進(fast-forward)”這個詞鉴腻。 由于你想要合并的分支 hotfix 所指向的提交 C5 是你所在的提交 C3 的直接后繼迷扇, 因此 Git 會直接將指針向前移動。

換句話說爽哎,當你試圖合并兩個分支時蜓席, 如果順著一個分支走下去能夠到達另一個分支,那么 Git 在合并兩者的時候倦青, 只會簡單的將指針向前推進(指針右移)瓮床,因為這種情況下的合并操作,沒有需要解決的分歧的地方产镐,這就叫做 “快進(fast-forward)”合并隘庄。(快進合并是不會產(chǎn)生沖突的

現(xiàn)在,最新的修改已經(jīng)在 master 分支所指向的提交快照中癣亚,你可以著手發(fā)布該修復了丑掺。

5)合并完成后,刪除hotfix分支

關(guān)于這個緊急問題的解決方案發(fā)布之后述雾,你需要準備回到被打斷之前時的工作中街州。 然而,你應該先刪除 hotfix分支玻孟,因為你已經(jīng)不再需要它了唆缴, master 分支已經(jīng)指向了同一個位置。

所以你可以使用帶 -d 選項的 git branch 命令來刪除分支:

# 1.查看工作目錄中文件狀態(tài)黍翎,非常干凈
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
nothing to commit, working tree clean

# 2.刪除hotfix分支
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git branch -d hotfix
Deleted branch hotfix (was 0690030).

# 3.查看版本庫中中的分支
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git branch
  dev
* master

6)之后我們就可以把修復的代碼推送到遠程倉庫了

這里先不講解面徽。

7)切換到dev分支,繼續(xù)自己的開發(fā)

現(xiàn)在你可以切換回你剛剛在工作的分支匣掸,繼續(xù)你的工作趟紊。

# 1.查看工作目錄中文件狀態(tài),非常干凈
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (dev)
$ git status
On branch dev
nothing to commit, working tree clean

# 2.切換到dev分支
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git checkout dev
Switched to branch 'dev'

# 巴拉巴拉繼續(xù)搬磚碰酝。

提示:你在 hotfix 分支上所做的工作并沒有包含到 dev 分支中霎匈。 如果你需要拉取 hotfix 所做的修改,你可以使用 git merge master 命令將 master 分支合并入 dev 分支送爸,或者你也可以等到 dev 分支完成其使命铛嘱,再將其合并回 master 分支暖释。

3、補充:分支選項

--merged--no-merged 這兩個有用的選項弄痹,可以過濾這個列表中饭入,已經(jīng)合并或尚未合并到當前分支的其他分支。

(1)--merged 選項

如果要查看哪些分支已經(jīng)合并到當前分支肛真,可以運行 git branch --merged命令:

$ git branch --merged
  iss53
* master

因為之前已經(jīng)合并了 iss53 分支谐丢,所以看到它在列表中。

在列表中蚓让,分支名字前沒有 * 號的分支乾忱,通常可以使用 git branch -d 刪除掉历极;你已經(jīng)將它們的工作整合到了另一個分支窄瘟,所以并不會失去任何東西。

(2)--no-merged 選項

查看所有未合并到當前分支的其他分支趟卸,可以運行 git branch --no-merged命令:

$ git branch --no-merged
  testing

這里顯示了testing分支蹄葱。 因為它包含了還未合并的工作(也就是該分支開發(fā)完還沒有合并),嘗試使用 git branch -d 命令刪除它時會失敵小:

$ git branch -d testing
error: The branch 'testing' is not fully merged.
If you are sure you want to delete it, run 'git branch -D testing'.

如果真的想要刪除該分支图云,并丟掉那些工作,可以使用 -D 選項強制刪除它邻邮。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末竣况,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子筒严,更是在濱河造成了極大的恐慌丹泉,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸭蛙,死亡現(xiàn)場離奇詭異摹恨,居然都是意外死亡,警方通過查閱死者的電腦和手機娶视,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門晒哄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人歇万,你說我怎么就攤上這事⊙悖” “怎么了贪磺?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長诅愚。 經(jīng)常有香客問我寒锚,道長劫映,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任刹前,我火速辦了婚禮泳赋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘喇喉。我一直安慰自己祖今,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布拣技。 她就那樣靜靜地躺著千诬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膏斤。 梳的紋絲不亂的頭發(fā)上徐绑,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音莫辨,去河邊找鬼傲茄。 笑死,一個胖子當著我的面吹牛沮榜,可吹牛的內(nèi)容都是我干的盘榨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼敞映,長吁一口氣:“原來是場噩夢啊……” “哼较曼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起振愿,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤捷犹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后冕末,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萍歉,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年档桃,在試婚紗的時候發(fā)現(xiàn)自己被綠了枪孩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡藻肄,死狀恐怖蔑舞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嘹屯,我是刑警寧澤攻询,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站州弟,受9級特大地震影響钧栖,放射性物質(zhì)發(fā)生泄漏低零。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一拯杠、第九天 我趴在偏房一處隱蔽的房頂上張望掏婶。 院中可真熱鬧,春花似錦潭陪、人聲如沸雄妥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茎芭。三九已至意蛀,卻和暖如春官边,著一層夾襖步出監(jiān)牢的瞬間励两,已是汗流浹背陶耍。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工畜晰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留西傀,地道東北人壁公。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓腔寡,卻偏偏與公主長得像洪添,于是被迫代替她去往敵國和親垦页。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

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