在Java程序開發中的定製開發規範,想要把項目正規高效的跑起來。引入 Git 版本控制,Git-Flow 便成爲了首選。今天動力節點Java學院來帶你瞭解一下。
1、爲何使用 git-flow
當在團隊開發中使用版本控制系統時,商定一個統一的工做流程是相當重要的。 Git 的確能夠在各個方面作不少事情,然而,若是在你的團隊中尚未能造成一個特定有效的工做流程,那麼混亂就將是不可避免的。
基本套路:你能夠定義一個徹底適合你本身項目的工做流程,或者使用一個別人定義好的。
2、安裝 git-flow
咱們使用 Homebrew 來安裝 git-flow:
1.brew install git-flow
以後,經過 git-flow 來初始化項目:
1.git flow init
這時候就會有一些配置的操做,先默認操做:
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.git
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? []
須要強調一點:git-flow 只是封裝了 git 的命令。
因此在咱們初始化的時候,對倉庫並無其餘改動,只是建立了幾個分支。固然,若是你不想繼續使用 git-flow ,那麼只須要簡單的停用 git-flow 的命令便可,不須要修改或者刪除任何文件。
爲了驗證一下,咱們看下目前的分支,執行:
1.git branch
輸出:
1.* develop架構
很簡單, develop 分支是咱們平常開發的分支,會有不少改動。而 master 主要針對線上分支,下面會細說。
這裏補充一點,咱們能夠經過 help 命令來查看用例。
1.git flow help
輸出以下:
1.usage: git flow <subcommand>
2.
3.Available subcommands are:ide
10.
11.Try 'git flow <subcommand> help' for details.
若是我要看 feature 相關命令呢?
1.git flow feature help
使用規範就會列出來:
1.usage: git flow feature [list] [-v]學習
3、分支模式
git-flow 模式會預設兩個主分支在倉庫中: 1. master 只能用來包含產品代碼 咱們不能直接工做在這個 master 分支上,而是在其餘指定的,獨立的特性分支中。
不直接提交改動到 master 分支上也是不少工做流程的一個共同的規則。
2. develop 是你進行任何新的開發的基礎分支 當你開始一個新的功能分支時,它將是開發的基礎。另外,該分支也聚集全部已經完成的功能,並等待被整合到 master 分支中。測試
上面說到的這兩個分支被稱做爲長期分支,它們會存活在項目的整個生命週期中。
而其餘的分支,例如針對功能的分支,針對發行的分支,僅僅只是臨時存在的。它們是根據須要來建立的,當它們完成了本身的任務以後就會被刪除掉。fetch
4、明確分支功能
1. master 分支 最爲穩定功能比較完整的隨時可發佈的代碼,即代碼開發完成,通過測試,沒有明顯的 bug,才能合併到 master 中。請注意永遠不要在 master 分支上直接開發和提交代碼,以確保 master 上的代碼一直可用;
2. develop 分支 用做平時開發的主分支,並一直存在,永遠是功能最新最全的分支,包含全部要發佈 到下一個 release 的代碼,主要用於合併其餘分支,好比 feature 分支; 若是修改代碼,新建 feature分支修改完再合併到 develop 分支。全部的 feature、 release 分支都是從 develop 分支上拉的。
3. feature 分支 這個分支主要是用來開發新的功能,一旦開發完成,經過測試沒問題,咱們合併回 develop 分支進入下一個 release 。
4. release 分支 用於發佈準備的專門分支。當開發進行到必定程度,或者說快到了既定的發佈日,能夠發佈時,創建一個 release 分支並指定版本號(能夠在 finish 的時候添加)。開發人員能夠對 release 分支上的代碼進行集中測試和修改 bug。(這個測試,測試新功能與已有的功能是否有衝突,兼容性)所有完成通過測試沒有問題後,將 release 分支上的代碼合併到 master 分支和 develop 分支。
5. hotfix 分支 用於修復線上代碼的 bug 。從 master 分支上拉。完成 hotfix 後,打上 tag 咱們合併回 master 和 develop 分支。
須要注意:
全部開發分支從 develop 分支拉。
全部 hotfix 分支從 master 拉。
全部在 master 上的提交都必要要有 tag,方便回滾。
只要有合併到 master 分支的操做,都須要和 develop 分支合併下,保證同步。
master 和 develop 分支是主要分支,主要分支每種類型只能有一個,派生分支每一個類型能夠同時存在多個。
5、關於 Feature 分支
在 Git-flow 中,經過使用 Feature 分支,使得咱們在同一時間開發多個分支更加簡單。 咱們接到了一個 Test1 需求,使用 feature start 來啓動:
git flow feature start test1
當咱們開始一個新的 feature 開發後:
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.this
咱們自動切到了 feature/test1 分支下,正好開始咱們的開發,建一個文件先:
1.vi main.js
寫入 console.log('hello jartto'); 接着提交咱們的變動:
1.git add .
2.git commit -m 'feat: add console.log'
好了,如今咱們開發完了,結束 feature 開發:
1.git flow feature finish test1
控制檯輸出了:
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 分支以前,是不會丟失任何歷史記錄的。
若是你還不瞭解 --no-ff 相關知識,能夠先看看:Git merge 的 –ff 和 –no-ff。
接着,咱們看一下變動記錄:
1.git log --oneline
輸出:
1.27e920c (HEAD -> develop) feat: add console.log
2.d975789 (master) Initial commit
6、release 分支-版本發佈
當咱們開發完畢,須要去發佈新版本的時候,咱們可使用:
1.git flow release start 0.1.0
控制檯會有一些提示:
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.spa
很清晰,咱們簡單說一下: 1.基於 develop 分支新建了 release/0.1.0 分支; 2.切換至 release/0.1.0 分支;
又出現了新問題: 1.這是什麼意思: Bumpthe version number now! 2. last-minute fixes 又是什麼意思?
那接下來咱們要作什麼呢?不着急,按照提示一步步來。
咱們修改了代碼,進行add,和 commit 以後,執行:
1.git flow release finish 0.1.0
這個過程當中間可能出現異常:
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
這裏主要有幾個操做: 1.首先, git-flow 會拉取遠程倉庫,以確保目前是最新的版本。 2.而後, release 的內容會被合併到 master 和 develop 兩個分支中去,這樣不只產品代碼爲最新的版本,並且新的功能分支也將基於最新代碼。 3.爲便於識別和作歷史參考, release 提交會被標記上這個 release 的 Tag。 4.清理操做,版本分支會被刪除,而且回到 develop。
7、Hotfix 線上代碼
若是線上代碼有問題,這時候你須要緊急修復呢?
咱們可使用 git flow hotfix :
1.git flow hotfix start jartto
看一下執行了什麼:
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.版本控制
接着咱們新建了目錄:
1.mkdir assets
放入一張圖片,修改完畢,提交併結束 hotfix:
1.git add .
2.git commit -m 'fix: assets img'
3.git flow hotfix finish 'jartto'
看一下 git-flow 有哪些操做:
1.Switched to branch 'master'
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
正是咱們上面添加的兩個標籤:
1.0.1.0
2.jartto
總結一下: 1.完成的改動會被合併到 master 中,一樣也會合併到 develop 分支中,這樣就能夠確保這個錯誤不會再次出如今下一個 release 中。 2.這個 hotfix 程序將被標記起來以便於參考。 3.這個 hotfix 分支將被刪除,而後切換到 develop 分支上去。
8、git-flow 流程圖示
恭喜你,到這裏你已經完成了 git-flow 的基本流程。爲了更加總體的理解工做流,咱們來看看下面這張流程圖: orm
清清楚楚,是否是和咱們上面的過程如出一轍。9、參考動力節點Java架構師班深度剖析Java底層原理,熱門技術深刻探討,前沿技術深刻解讀,大項目實戰重構,從0到1作架構,從全局思惟出發,帶你把控大型項目中別人忽略的重要細節節點,站在巨人肩膀上學習架構師,帶你領會架構師不同的視野