Git学习笔记—Git Flow
?
在Java程序開發(fā)中的定制開發(fā)規(guī)范,想要把項(xiàng)目正規(guī)高效的跑起來(lái)。引入 Git 版本控制,Git-Flow 便成為了首選。
今天動(dòng)力節(jié)點(diǎn)Java學(xué)院來(lái)帶你了解一下。
一、為什么使用 git-flow
當(dāng)在團(tuán)隊(duì)開發(fā)中使用版本控制系統(tǒng)時(shí),商定一個(gè)統(tǒng)一的工作流程是至關(guān)重要的。?Git?的確可以在各個(gè)方面做很多事情,然而,如果在你的團(tuán)隊(duì)中還沒有能形成一個(gè)特定有效的工作流程,那么混亂就將是不可避免的。
基本套路:你可以定義一個(gè)完全適合你自己項(xiàng)目的工作流程,或者使用一個(gè)別人定義好的。
二、安裝 git-flow
我們使用?Homebrew?來(lái)安裝?git-flow:
1.brew install git-flow之后,通過(guò)?git-flow?來(lái)初始化項(xiàng)目:
1.git flow init這時(shí)候就會(huì)有一些配置的操作,先默認(rèn)操作:
1.Initialized empty Git repository in /Users/jartto/Documents/git-flow-demo/.git/ 2.No branches exist yet. Base branches must be created now. 3.Branch name for production releases: [master] 4.Branch name for "next release" development: [develop] 5. 6.*** Please tell me who you are. 7. 8.Run 9. 10. ?git config --global user.email "you@example.com" 11. ?git config --global user.name "Your Name" 12. 13.to set your account's default identity. 14.Omit --global to set the identity only in this repository. 15. 16.fatal: unable to auto-detect email address (got 'jartto@bogon.(none)') 17.fatal: Not a valid object name: 'master'. 18.error: pathspec 'develop' did not match any file(s) known to git. 19. 20.How to name your supporting branch prefixes? 21.Feature branches? [feature/] 22.Release branches? [release/] 23.Hotfix branches? [hotfix/] 24.Support branches? [support/] 25.Version tag prefix? []需要強(qiáng)調(diào)一點(diǎn):git-flow 只是封裝了 git 的命令。
所以在我們初始化的時(shí)候,對(duì)倉(cāng)庫(kù)并沒有其他改動(dòng),只是創(chuàng)建了幾個(gè)分支。當(dāng)然,如果你不想繼續(xù)使用?git-flow?,那么只需要簡(jiǎn)單的停用?git-flow?的命令即可,不需要修改或者刪除任何文件。
為了驗(yàn)證一下,我們看下目前的分支,執(zhí)行:
1.git branch輸出:
master
1.* develop 2. ?master很簡(jiǎn)單,?develop?分支是我們?nèi)粘i_發(fā)的分支,會(huì)有很多改動(dòng)。而?master?主要針對(duì)線上分支,下面會(huì)細(xì)說(shuō)。
這里補(bǔ)充一點(diǎn),我們可以通過(guò) help 命令來(lái)查看用例。
1.git flow help輸出如下:
1.sage: git flow <subcommand> 2. 3.Available subcommands are: 4. ? init ? ? ?Initialize a new git repo with support for the branching model. 5. ? feature ? Manage your feature branches. 6. ? release ? Manage your release branches. 7. ? hotfix ? ?Manage your hotfix branches. 8. ? support ? Manage your support branches. 9. ? version ? Shows version information. 10. 11.Try 'git flow <subcommand> help' for details.?
如果我要看?feature?相關(guān)命令呢?
1.git flow feature help使用規(guī)范就會(huì)列出來(lái):
1.usage: git flow feature [list] [-v] 2. ? ? ? git flow feature start [-F] <name> [<base>] 3. ? ? ? git flow feature finish [-rFk] <name|nameprefix> 4. ? ? ? git flow feature publish <name> 5. ? ? ? git flow feature track <name> 6. ? ? ? git flow feature diff [<name|nameprefix>] 7. ? ? ? git flow feature rebase [-i] [<name|nameprefix>] 8. ? ? ? git flow feature checkout [<name|nameprefix>] 9. ? ? ? git flow feature pull <remote> [<name>]?
三、分支模式
git-flow?模式會(huì)預(yù)設(shè)兩個(gè)主分支在倉(cāng)庫(kù)中: 1.?master?只能用來(lái)包含產(chǎn)品代碼 我們不能直接工作在這個(gè)?master?分支上,而是在其他指定的,獨(dú)立的特性分支中。
不直接提交改動(dòng)到 master 分支上也是很多工作流程的一個(gè)共同的規(guī)則。
2.?develop?是你進(jìn)行任何新的開發(fā)的基礎(chǔ)分支 當(dāng)你開始一個(gè)新的功能分支時(shí),它將是開發(fā)的基礎(chǔ)。另外,該分支也匯集所有已經(jīng)完成的功能,并等待被整合到?master?分支中。
上面說(shuō)到的這兩個(gè)分支被稱作為長(zhǎng)期分支,它們會(huì)存活在項(xiàng)目的整個(gè)生命周期中。
而其他的分支,例如針對(duì)功能的分支,針對(duì)發(fā)行的分支,僅僅只是臨時(shí)存在的。它們是根據(jù)需要來(lái)創(chuàng)建的,當(dāng)它們完成了自己的任務(wù)之后就會(huì)被刪除掉。
四、明確分支功能
1.?master?分支 最為穩(wěn)定功能比較完整的隨時(shí)可發(fā)布的代碼,即代碼開發(fā)完成,經(jīng)過(guò)測(cè)試,沒有明顯的?bug,才能合并到?master?中。請(qǐng)注意永遠(yuǎn)不要在?master?分支上直接開發(fā)和提交代碼,以確保?master?上的代碼一直可用;
2.?develop?分支 用作平時(shí)開發(fā)的主分支,并一直存在,永遠(yuǎn)是功能最新最全的分支,包含所有要發(fā)布 到下一個(gè)?release?的代碼,主要用于合并其他分支,比如?feature?分支; 如果修改代碼,新建?feature分支修改完再合并到?develop?分支。所有的?feature、?release?分支都是從?develop?分支上拉的。
3.?feature?分支 這個(gè)分支主要是用來(lái)開發(fā)新的功能,一旦開發(fā)完成,通過(guò)測(cè)試沒問(wèn)題,我們合并回?develop?分支進(jìn)入下一個(gè)?release?。
4.?release?分支 用于發(fā)布準(zhǔn)備的專門分支。當(dāng)開發(fā)進(jìn)行到一定程度,或者說(shuō)快到了既定的發(fā)布日,可以發(fā)布時(shí),建立一個(gè)?release?分支并指定版本號(hào)(可以在?finish?的時(shí)候添加)。開發(fā)人員可以對(duì)?release?分支上的代碼進(jìn)行集中測(cè)試和修改?bug。(這個(gè)測(cè)試,測(cè)試新功能與已有的功能是否有沖突,兼容性)全部完成經(jīng)過(guò)測(cè)試沒有問(wèn)題后,將?release?分支上的代碼合并到?master?分支和?develop?分支。
5.?hotfix?分支 用于修復(fù)線上代碼的?bug?。從?master?分支上拉。完成?hotfix?后,打上?tag?我們合并回?master?和?develop?分支。
需要注意:
- 所有開發(fā)分支從?develop?分支拉。
- 所有?hotfix?分支從?master?拉。
- 所有在?master?上的提交都必要要有?tag,方便回滾。
- 只要有合并到?master?分支的操作,都需要和?develop?分支合并下,保證同步。
- master?和?develop?分支是主要分支,主要分支每種類型只能有一個(gè),派生分支每個(gè)類型可以同時(shí)存在多個(gè)。
五、關(guān)于 Feature 分支
在?Git-flow?中,通過(guò)使用?Feature?分支,使得我們?cè)谕粫r(shí)間開發(fā)多個(gè)分支更加簡(jiǎn)單。 我們接到了一個(gè)?Test1?需求,使用?feature start?來(lái)啟動(dòng):
git flow feature start test1
當(dāng)我們開始一個(gè)新的?feature?開發(fā)后:
1.Switched to a new branch 'feature/test1' 2. 3.Summary of actions: 4.- A new branch 'feature/test1' was created, based on 'develop' 5.- You are now on branch 'feature/test1' 6. 7.Now, start committing on your feature. When done, use: 8. 9. ? ? git flow feature finish test1我們自動(dòng)切到了?feature/test1?分支下,正好開始我們的開發(fā),建一個(gè)文件先:
1.vi main.js寫入?console.log('hello jartto');?接著提交我們的變更:
1.git add . 2.git commit -m 'feat: add console.log'好了,現(xiàn)在我們開發(fā)完了,結(jié)束 feature 開發(fā):
1.git flow feature finish test1制臺(tái)輸出了:
1.Switched to branch 'develop' 2.Updating d975789..27e920c 3.Fast-forward 4.main.js | 1 + 5.1 file changed, 1 insertion(+) 6.create mode 100644 main.js 7.Deleted branch feature/test1 (was 27e920c). 8. 9.Summary of actions: 10.- The feature branch 'feature/test1' was merged into 'develop' 11.- Feature branch 'feature/test1' has been removed 12.- You are now on branch 'develop'這里做了幾件事情: 1.將?feature/test1?分支合并到了?develop?分支; 2.刪除了?feature/test1; 3.切換到?develop?分支;
需要注意:?git-flow?使用的命令是:
1.git merge —no-ff feature/test1這樣,在我們移除?feature?分支之前,是不會(huì)丟失任何歷史記錄的。
如果你還不了解?--no-ff?相關(guān)知識(shí),可以先看看:Git merge 的 –ff 和 –no-ff。
接著,我們看一下變更記錄:
1.git merge —no-ff feature/test1輸出:
1.27e920c (HEAD -> develop) feat: add console.log 2.d975789 (master) Initial commit六、release 分支-版本發(fā)布
當(dāng)我們開發(fā)完畢,需要去發(fā)布新版本的時(shí)候,我們可以使用:
1.git flow release start 0.1.0控制臺(tái)會(huì)有一些提示:
1.Switched to a new branch 'release/0.1.0' 2. 3.Summary of actions: 4.- A new branch 'release/0.1.0' was created, based on 'develop' 5.- You are now on branch 'release/0.1.0' 6. 7.Follow-up actions: 8.- Bump the version number now! 9.- Start committing last-minute fixes in preparing your release 10.- When done, run: 11. 12. ? ? git flow release finish '0.1.0'很清晰,我們簡(jiǎn)單說(shuō)一下: 1.基于?develop?分支新建了?release/0.1.0?分支; 2.切換至?release/0.1.0?分支;
又出現(xiàn)了新問(wèn)題: 1.這是什么意思:?Bumpthe version number now!?2.?last-minute fixes?又是什么意思?
那接下來(lái)我們要做什么呢?不著急,按照提示一步步來(lái)。
我們修改了代碼,進(jìn)行add,和 commit 之后,執(zhí)行:
1.git flow release finish 0.1.0這個(gè)過(guò)程中間可能出現(xiàn)異常:
1.fatal: no tag message? 2.Tagging failed. Please run finish again to retry.輸出:
1.Switched to branch 'develop' 2.Merge made by the 'recursive' strategy. 3.test.js | 0 4.1 file changed, 0 insertions(+), 0 deletions(-) 5.create mode 100644 test.js 6.Deleted branch release/0.1.0 (was 0426707). 7. 8.Summary of actions: 9.- Latest objects have been fetched from 'origin' 10.- Release branch has been merged into 'master' 11.- The release was tagged '0.1.0' 12.- Release branch has been back-merged into 'develop' 13.- Release branch 'release/0.1.0' has been deleted這里主要有幾個(gè)操作: 1.首先,?git-flow?會(huì)拉取遠(yuǎn)程倉(cāng)庫(kù),以確保目前是最新的版本。 2.然后,?release?的內(nèi)容會(huì)被合并到?master?和?develop?兩個(gè)分支中去,這樣不僅產(chǎn)品代碼為最新的版本,而且新的功能分支也將基于最新代碼。 3.為便于識(shí)別和做歷史參考,?release?提交會(huì)被標(biāo)記上這個(gè)?release?的?Tag。 4.清理操作,版本分支會(huì)被刪除,并且回到?develop。
七、Hotfix 線上代碼
如果線上代碼有問(wèn)題,這時(shí)候你需要緊急修復(fù)呢?
我們可以使用?git flow hotfix?:
1.git flow hotfix start jartto看一下執(zhí)行了什么:
1.Switched to a new branch 'hotfix/jartto' 2. 3.Summary of actions: 4.- A new branch 'hotfix/jartto' was created, based on 'master' 5.- You are now on branch 'hotfix/jartto' 6. 7.Follow-up actions: 8.- Bump the version number now! 9.- Start committing your hot fixes 10.- When done, run: 11. 12. ? ? git flow hotfix finish 'jartto'接著我們新建了目錄:
1.mkdir assets放入一張圖片,修改完畢,提交并結(jié)束?hotfix:
1.git add . 2.git commit -m 'fix: assets img' 3.git flow hotfix finish 'jartto'看一下?git-flow?有哪些操作:
2.Merge made by the 'recursive' strategy. 3.assets/git-flow.png | Bin 0 -> 25839 bytes 4.1 files changed, 0 insertions(+), 0 deletions(-) 5.create mode 100644 assets/git-flow.png 6.Switched to branch 'develop' 7.Merge made by the 'recursive' strategy. 8.assets/git-flow.png | Bin 0 -> 25839 bytes 9.1 files changed, 0 insertions(+), 0 deletions(-) 10.create mode 100644 assets/git-flow.png 11.Deleted branch hotfix/jartto (was a734849). 12. 13.Summary of actions: 14.- Latest objects have been fetched from 'origin' 15.- Hotfix branch has been merged into 'master' 16.- The hotfix was tagged 'jartto' 17.- Hotfix branch has been back-merged into 'develop' 18.- Hotfix branch 'hotfix/jartto' has been deleted查看一下目前的?Tag?情況:
1.git tag正是我們上面添加的兩個(gè)標(biāo)簽:
1.0.1.0 2.jartto總結(jié)一下: 1.完成的改動(dòng)會(huì)被合并到?master?中,同樣也會(huì)合并到?develop?分支中,這樣就可以確保這個(gè)錯(cuò)誤不會(huì)再次出現(xiàn)在下一個(gè)?release?中。 2.這個(gè)?hotfix?程序?qū)⒈粯?biāo)記起來(lái)以便于參考。 3.這個(gè)?hotfix?分支將被刪除,然后切換到?develop?分支上去。
八、git-flow 流程圖示
恭喜你,到這里你已經(jīng)完成了?git-flow?的基本流程。為了更加整體的理解工作流,我們來(lái)看看下面這張流程圖:?
清清楚楚,是不是和我們上面的過(guò)程一模一樣。
九、參考
動(dòng)力節(jié)點(diǎn)Java架構(gòu)師班深度剖析Java底層原理,熱門技術(shù)深入探討,前沿技術(shù)深入解讀,大項(xiàng)目實(shí)戰(zhàn)重構(gòu),從0到1做架構(gòu),從全局思維出發(fā),帶你把控大型項(xiàng)目中別人忽略的重要細(xì)節(jié)節(jié)點(diǎn),站在巨人肩膀上學(xué)習(xí)架構(gòu)師,帶你領(lǐng)會(huì)架構(gòu)師不一樣的視野
?
?
總結(jié)
以上是生活随笔為你收集整理的Git学习笔记—Git Flow的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Git 提交规范-Java程序员收藏必备
- 下一篇: 学习Java编程到底是为了什么,该具备什