開發(fā)一個版本涉兽,采用的發(fā)布流程:
- 從
master
分支的最新代碼拉取一個開發(fā)分支深碱,在上面進行開發(fā)(這里假設(shè)開發(fā)分支為dev)嗤谚。 - 在
dev
分支上不斷地進行提交版本棺蛛,期間master
分支也會有因為其他版本上線,而不停有版本合并到master
分支上巩步。 -
dev
分支要測試發(fā)布的時候旁赊,要把master
分支的代碼,先合并到dev
分支上椅野。 - 最后發(fā)布完成后终畅,再把
dev
分支的代碼合并到master
分支上。
1竟闪、分支合并說明
當dev
分支上的工作完成后离福,需要將其合并到主分支master上
。合并過程其實很快炼蛤,只需要將master
指針指向dev
指針指向的節(jié)點妖爷,然后再將HEAD
指針指向master
指針指向的節(jié)點即可。即分支的合并就是修改了兩個指針的指向而已理朋。
對于合并的較形象的理解是:合并就是將原來在
dev
分支上的節(jié)點絮识,全部投射到master
分支上绿聘。
合并分支命令:git merge
。
對于分支的合并需要注意:如果需要將分支B合并到分支A上次舌,首先要將當前分支切換到A分支上熄攘,然后再運行合并命令。
2垃它、綜合示例
讓我們來看一個簡單的分支新建與分支合并的例子鲜屏,實際工作中你可能會用到類似的工作流程。
例如:
- 開發(fā)某個網(wǎng)站国拇。
- 為實現(xiàn)某個新的用戶需求洛史,創(chuàng)建一個分支。
- 在這個分支上開展工作酱吝。
正在此時也殖,你突然接到一個電話說有個很嚴重的問題需要緊急修補。
你將按照如下方式來處理:
- 切換到主分支(production branch)或者開發(fā)分支上务热。
- 為這個緊急任務(wù)新建一個分支忆嗜,并在其中修復它。
- 在測試通過之后崎岂,切換回線上分支捆毫,然后合并這個修補分支,最后將改動推送到線上分支冲甘。
- 切換回你最初工作的分支上绩卤,繼續(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
選項強制刪除它邻邮。