文章目錄
- 前言
- 一、Git的分支管理策略
- ? ? ? 1.1?Fast forward 模式和--no-ff 模式
- ? ? ? 1.2 企業(yè)分支管理策略
- 二、bug分支
- 三、刪除臨時(shí)分支
- 四、總結(jié)
- 總結(jié)
前言
一、Git的分支管理策略
1.1?Fast forward 模式和--no-ff 模式
通常合并分支時(shí),如果可能,Git 會(huì)采用 Fast forward 模式。還記得如果我們采用 Fastforward 模式之后,形成的合并結(jié)果是什么呢?回顧一下圖示說(shuō)明:?
在這種 Fast forward 模式下,刪除分支后,查看分支歷史時(shí),會(huì)丟掉分支信息,看不出來(lái)最新提交到底是 merge 進(jìn)來(lái)的還是正常提交的。
但在合并沖突部分,我們也看到通過(guò)解決沖突問(wèn)題,會(huì)再進(jìn)行一次新的提交,得到的最終狀態(tài)為:圖示說(shuō)明:?
那么這就不是 Fast forward 模式了,這樣的好處是,從分支歷史上就可以看出分支信息。例如我們現(xiàn)在已經(jīng)刪除了在合并沖突部分創(chuàng)建的 dev1 分支,但依舊能看到 master 其實(shí)是由其他分支合并得到。代碼示例:hyb@139-159-150-152:~/gitcode$ git log --graph --pretty=oneline --abbrev-commit* 2976afc (HEAD -> master) merge ReadMe|\| * c594fd1 modify ReadMe* | c10f6d0 modify ReadMe|/Git 支持我們強(qiáng)制禁用 Fast forward 模式,那么就會(huì)在 merge 時(shí)生成一個(gè)新的 commit ,這樣,從分支歷史上就可以看出分支信息。
下?我們實(shí)戰(zhàn)?下 --no-ff 方式的 git merge 。
步驟一: 首先,創(chuàng)建新的分支 dev2 ,并切換至新的分支:代碼示例:hyb@139-159-150-152:~/gitcode$ git checkout -b dev2? ? ? ? ? ? ? ?#切換到分支dev2Switched to a new branch 'dev2'
步驟二:修改 ReadMe 文件,并提交一個(gè)新的 commit :代碼示例:hyb@139-159-150-152:~/gitcode$ cat ReadMe? ?hello bithello githello worldhello version1hello version2hello version3write bbb for new brancha,b,c,d? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #修改文件信息hyb@139-159-150-152:~/gitcode$ git add .hyb@139-159-150-152:~/gitcode$ git commit -m"modify ReadMe"[dev2 41b082f] modify ReadMe1 file changed, 1 insertion(+)
?步驟三:切回 master 分支,通過(guò)開(kāi)始--no-ff 方式合并
代碼示例:
hyb@139-159-150-152:~/gitcode$ git checkout masterSwitched to branch 'master'hyb@139-159-150-152:~/gitcode$ git merge --no-ff -m "merge with no-ff" dev2Merge made by the 'recursive' strategy.ReadMe | 1 +1 file changed, 1 insertion(+)hyb@139-159-150-152:~/gitcode$ cat ReadMehello bithello githello worldhello version1hello version2hello version3write bbb for new brancha,b,c,d請(qǐng) 注意 --no-ff 參數(shù),表示禁用?Fast forward 模式。禁用 Fast forward 模式后合并會(huì)創(chuàng)建一個(gè)新的 commit ,所以加上 -m 參數(shù),把描述寫(xiě)進(jìn)去。
步驟四:合并后,查看分支歷史
代碼示例:
hyb@139-159-150-152:~/gitcode$ git log --graph --pretty=oneline --abbrev-commit* 5bd16b4 (HEAD -> master) merge with no-ff|\| * 41b082f (dev2) modify ReadMe|/可以看到,不使用 Fast forward 模式,merge后就像這樣:圖示示例:![]()
總結(jié):
所以在合并分支時(shí),加上 --no-ff 參數(shù)就可以用普通模式合并,合并后的歷史有分支,能看出來(lái)曾經(jīng)做過(guò)合并,而 fast forward 合并就看不出來(lái)曾經(jīng)做過(guò)合并。
1.2 企業(yè)分支管理策略
在實(shí)際開(kāi)發(fā)中,我們應(yīng)該按照幾個(gè) 基本原則進(jìn)行分支管理:
首先,master分支應(yīng)該是非常穩(wěn)定的,也就是僅用來(lái)發(fā)布新版本,平時(shí)不能在上面干活;
那在哪?活呢?
干活都在dev分支上,也就是說(shuō),dev分支是不穩(wěn)定的,到某個(gè)時(shí)候,比如1.0版本發(fā)布時(shí),再把dev分支合并到master上,在master分支發(fā)布1.0版本;你和你的小伙伴們每個(gè)人都在dev分支上干活,每個(gè)人都有自己的分支,時(shí)不時(shí)地往dev分支上合并就可以了。圖示示例:所以,團(tuán)隊(duì)合作的分支看起來(lái)就像這樣:![]()
二、bug分支
假如我們現(xiàn)在正在 dev2 分支上進(jìn)行開(kāi)發(fā),開(kāi)發(fā)到一半,突然發(fā)現(xiàn) master 分支上面有 bug,需要解決。在Git中,每個(gè) bug 都可以通過(guò)一個(gè)新的臨時(shí)分支來(lái)修復(fù),修復(fù)后,合并分支,然后將臨時(shí)分支刪除。
可現(xiàn)在 dev2 的代碼在工作區(qū)中開(kāi)發(fā)了一半,還無(wú)法提交,怎么辦?代碼示例:hyb@139-159-150-152:~/gitcode$ git branch* dev2masterhyb@139-159-150-152:~/gitcode$ cat ReadMehello bithello githello worldhello version1hello version2hello version3write bbb for new brancha,b,c,di am coding ...? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #dev2 的代碼在工作區(qū)中開(kāi)發(fā)了一半hyb@139-159-150-152:~/gitcode$ git statusOn branch dev2Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)modified: ReadMeno changes added to commit (use "git add" and/or "git commit -a")
Git 提供了 git stash 命令,可以將當(dāng)前的?作區(qū)信息進(jìn)?儲(chǔ)藏,被儲(chǔ)藏的內(nèi)容可以在將來(lái)某個(gè)時(shí)間恢復(fù)出來(lái)。代碼示例:hyb@139-159-150-152:~/gitcode$ git stashSaved working directory and index state WIP on dev2: 41b082f modify ReadMehyb@139-159-150-152:~/gitcode$ git statusOn branch dev2nothing to commit, working tree clean用 git status 查看工作區(qū),就是干凈的(除非有沒(méi)有被 Git 管理的文件),因此可以放心地創(chuàng)建分支來(lái)修復(fù)bug。
儲(chǔ)藏 dev2 工作區(qū)之后,由于我們要基于master分支修復(fù) bug,所以需要切回 master 分支,再新建臨時(shí)分支來(lái)修復(fù) bug。代碼示例:hyb@139-159-150-152:~/gitcode$ git checkout master? ? ? ? ? # 切回master分支Switched to branch 'master'hyb@139-159-150-152:~/gitcode$ git checkout -b fix_bug ? # 新建并切換到 fix_bug 分支Switched to a new branch 'fix_bug'hyb@139-159-150-152:~/gitcode$ vim ReadMehyb@139-159-150-152:~/gitcode$ cat ReadMehello bithello githello worldhello version1hello version2hello version3write bbb for new brancha,b,c,d,e? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? # 修復(fù)bug--忘記寫(xiě)ehyb@139-159-150-152:~/gitcode$ git add ReadMe ? ? ? ? ? ? ? # 重新add,commithyb@139-159-150-152:~/gitcode$ git commit -m"fix bug"[fix_bug 4bbc0c4] fix bug1 file changed, 1 insertion(+), 1 deletion(-)
修復(fù)完成后,切換到 master 分支,并完成合并,最后刪除 fix_bug 分支:代碼示例:hyb@139-159-150-152:~/gitcode$ git checkout masterSwitched to branch 'master'hyb@139-159-150-152:~/gitcode$ git merge --no-ff -m"merge fix_bug branch" fix_buMerge made by the 'recursive' strategy.ReadMe | 2 +-1 file changed, 1 insertion(+), 1 deletion(-)hyb@139-159-150-152:~/gitcode$ cat ReadMehello bithello githello worldhello version1hello version2hello version3write bbb for new brancha,b,c,d,ehyb@139-159-150-152:~/gitcode$ git branch -d fix_bugDeleted branch fix_bug (was 4bbc0c4).
至此,bug 的修復(fù)工作已經(jīng)做完了,我們還要繼續(xù)回到 dev2 分支進(jìn)行開(kāi)發(fā)。切換回 dev2 分支:代碼示例:hyb@139-159-150-152:~/gitcode$ git checkout dev2Switched to branch 'dev2'hyb@139-159-150-152:~/gitcode$ git statusOn branch dev2nothing to commit, working tree clean
工作區(qū)是干凈的,剛才的工作現(xiàn)場(chǎng)存到哪去了?
用 git stash list 命令看看:
代碼示例:
hyb@139-159-150-152:~/gitcode$ git stash liststash@{0}: WIP on dev2: 41b082f modify ReadMe
?作現(xiàn)場(chǎng)還在,Git 把 stash 內(nèi)容存在某個(gè)地方了,但是需要恢復(fù)?下,如何恢復(fù)現(xiàn)場(chǎng)呢?我們可以使用?git stash pop 命令,恢復(fù)的同時(shí)會(huì)把 stash 也刪了,代碼示例:hyb@139-159-150-152:~/gitcode$ git stash popOn branch dev2Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)modified: ReadMeno changes added to commit (use "git add" and/or "git commit -a")Dropped refs/stash@{0} (4f873250b3503687b5efd26196776aee7e3724c2)
再次查看的時(shí)候,我們已經(jīng)發(fā)現(xiàn)已經(jīng)沒(méi)有現(xiàn)場(chǎng)可以恢復(fù)了代碼示例:hyb@139-159-150-152:~/gitcode$ git stash listhyb@139-159-150-152:~/gitcode$
另外,恢復(fù)現(xiàn)場(chǎng)也可以采用?git stash apply 恢復(fù),但是恢復(fù)后,stash內(nèi)容并不刪除,你需要 用 git stash drop 來(lái)刪除;你可以多次stash,恢復(fù)的時(shí)候,先用? git stash list 查看,然后恢復(fù)指定的stash,用命令git stash apply stash@{0} ,這部分請(qǐng)同學(xué)們自行使用。
恢復(fù)完代碼之后我們便可以繼續(xù)完成開(kāi)發(fā),開(kāi)發(fā)完成后便可以進(jìn)行提交:代碼例如:hyb@139-159-150-152:~/gitcode$ cat ReadMehello bithello githello worldhello version1hello version2hello version3write bbb for new brancha,b,c,di am coding ... Done!hyb@139-159-150-152:~/gitcode$ git add .hyb@139-159-150-152:~/gitcode$ git commit -m"modify ReadMe"[dev2 ed0916d] modify ReadMe1 file changed, 1 insertion(+)
但我們注意到了,修復(fù) bug 的內(nèi)容,并沒(méi)有在 dev2 上顯示。 此時(shí)的狀態(tài)圖為:
Master 分支目前最新的提交,是要領(lǐng)先于新建 dev2 時(shí)基于的 master 分支的提交的,所以我們?cè)?dev2 中當(dāng)然看不見(jiàn)修復(fù) bug 的相關(guān)代碼。
我們的最終目的是要讓 master 合并 dev2 分支的,那么正常情況下我們切回 master 分支直接合并即可,但這樣其實(shí)是 有一定風(fēng)險(xiǎn)的。是因?yàn)樵诤喜⒎种r(shí)可能會(huì)有沖突,而代碼沖突需要我們手動(dòng)解決(在 master 上解決)。我們無(wú)法保證對(duì)于沖突問(wèn)題可以正確地一次性解決掉,因?yàn)樵趯?shí)際的項(xiàng)目中,代碼沖突不只一兩行那么簡(jiǎn)單,有可能幾十上百行,甚至更多,解決的過(guò)程中難免手誤出錯(cuò),導(dǎo)致錯(cuò)誤的代碼被合并到 master 上。此時(shí)的狀態(tài)圖為:![]()
解決這個(gè)問(wèn)題的?個(gè)好的建議就是:最好在自己的分支上合并下 master ,再讓 master 去合并dev ,這樣做的目的是有沖突可以在本地分支解決并進(jìn)行測(cè)試,而不影響 master 。此時(shí)的狀態(tài)圖為:第一步:
第二步:
注意:對(duì)應(yīng)的實(shí)操演示如下,要說(shuō)明的是,以下演示的merge操作,沒(méi)有使用 --no-ff ,但上述的圖示是禁用 Fast forward 了模式后得出的,主要是為了方便解釋問(wèn)題。
代碼示例:
# dev 合并 masterhyb@139-159-150-152:~/gitcode$ git branch* dev2masterhyb@139-159-150-152:~/gitcode$ git merge masterAuto-merging ReadMeCONFLICT (content): Merge conflict in ReadMeAutomatic merge failed; fix conflicts and then commit the result.# 發(fā)?沖突hyb@139-159-150-152:~/gitcode$ cat ReadMehello bithello githello worldhello version1hello version2hello version3write bbb for new branch<<<<<<< HEADa,b,c,di am coding ... Done!=======a,b,c,d,e>>>>>>> master# 解決沖突并重新提交hyb@139-159-150-152:~/gitcode$ vim ReadMehyb@139-159-150-152:~/gitcode$ cat ReadMehello bithello githello worldhello version1hello version2hello version3write bbb for new brancha,b,c,d,ei am coding ... Done!hyb@139-159-150-152:~/gitcode$ git add .hyb@139-159-150-152:~/gitcode$ git commit -m"merge master"[dev2 447d29f] merge masterhyb@139-159-150-152:~/gitcode$ git statusOn branch dev2nothing to commit, working tree clean# 切回masterhyb@139-159-150-152:~/gitcode$ git checkout masterSwitched to branch 'master'# master 合并 dev2---?需解決沖突??!hyb@139-159-150-152:~/gitcode$ git merge dev2Updating 193421f..447d29fFast-forwardReadMe | 1 +1 file changed, 1 insertion(+)hyb@139-159-150-152:~/gitcode$ git statusOn branch masternothing to commit, working tree clean# 刪除 dev2 分?hyb@139-159-150-152:~/gitcode$ git branch -d dev2Deleted branch dev2 (was 447d29f).
三、刪除臨時(shí)分支
軟件開(kāi)發(fā)中,總有?窮?盡的新的功能要不斷添加進(jìn)來(lái)。添加?個(gè)新功能時(shí),你肯定不希望因?yàn)?些實(shí)驗(yàn)性質(zhì)的代碼,把主分?搞亂了,所以,每添加?個(gè)新功能,最好新建?個(gè)分?,我們可以將其稱(chēng)之為 feature 分?,在上?開(kāi)發(fā),完成后,合并,最后,刪除該 feature 分?。
可是,如果我們今天正在某個(gè) feature 分?上開(kāi)發(fā)了?半,被產(chǎn)品經(jīng)理突然叫停,說(shuō)是要停?新功能的開(kāi)發(fā)。雖然??了,但是這個(gè) feature 分?還是必須就地銷(xiāo)毀,留著??了。這時(shí)使?傳統(tǒng)的 git branch -d 命令刪除分?的?法是不?的。演?如下:# 新增并切換到 dev3 分支hyb@139-159-150-152:~/gitcode$ git checkout -b dev3Switched to a new branch 'dev3'# 開(kāi)始開(kāi)發(fā)新功能并提交hyb@139-159-150-152:~/gitcode$ vim ReadMehyb@139-159-150-152:~/gitcode$ cat ReadMehello bithello githello worldhello version1hello version2hello version3write bbb for new brancha,b,c,d,ei am coding ... Done!i am writing new features ...hyb@139-159-150-152:~/gitcode$ git add .hyb@139-159-150-152:~/gitcode$ git commit -m"modify ReadMe for new features"[dev3 cd2f149] modify ReadMe for new features1 file changed, 1 insertion(+)# 此時(shí)新功能叫停# 切回master準(zhǔn)備刪除dev3hyb@139-159-150-152:~/gitcode$ git checkout masterSwitched to branch 'master'# 常規(guī)刪除dev3分支時(shí)失敗hyb@139-159-150-152:~/gitcode$ git branch -d dev3error: The branch 'dev3' is not fully merged.If you are sure you want to delete it, run 'git branch -D dev3'.
直接使用傳統(tǒng)的刪除分支的方法不行,按照提示,有了如下方式:代碼示例:hyb@139-159-150-152:~/gitcode$ git branch -D dev3Deleted branch dev3 (was cd2f149).hyb@139-159-150-152:~/gitcode$ git branch* master
四、總結(jié)
gitee分支的作用:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-738152.html
分支在實(shí)際中有什么用呢?假設(shè)你準(zhǔn)備開(kāi)發(fā)一個(gè)新功能,但是需要兩周才能完成,第一周你寫(xiě)了50%的代碼,如果立刻提交,由于代碼還沒(méi)寫(xiě)完,不完整的代碼庫(kù)會(huì)導(dǎo)致別人不能干活了。如果等代碼全部寫(xiě)完再一次提交,又存在丟失每天進(jìn)度的巨大風(fēng)險(xiǎn)。現(xiàn)在有了分支,就不用怕了。你創(chuàng)建了一個(gè)屬于你自己的分支,別人看不到,還繼續(xù)在原來(lái)的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到開(kāi)發(fā)完畢后,再一次性合并到原來(lái)的分支上,這樣,既安全,又不影響別人工作。并且Git無(wú)論創(chuàng)建、切換和刪除分支,Git在1秒鐘之內(nèi)就能完成!無(wú)論你的版本庫(kù)是1個(gè)文件還是1萬(wàn)個(gè)文件。
總結(jié)
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-738152.html
到了這里,關(guān)于【Git企業(yè)開(kāi)發(fā)】第四節(jié).Git的分支管理策略和bug分支的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!