在Java程式開發中的定制開發規範,想要把項目正規高效的跑起來。引入 Git 版本控制,Git-Flow 便成為了首選。今天動力節點Java學院來帶你了解一下。
一、為什麼使用 git-flow
當在團隊開發中使用版本控制系統時,商定一個統一的工作流程是至關重要的。 Git 的确可以在各個方面做很多事情,然而,如果在你的團隊中還沒有能形成一個特定有效的工作流程,那麼混亂就将是不可避免的。
基本套路:你可以定義一個完全适合你自己項目的工作流程,或者使用一個别人定義好的。
二、安裝 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 config --global user.email "[email protected]"
-
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? []
需要強調一點:git-flow 隻是封裝了 git 的指令。
是以在我們初始化的時候,對倉庫并沒有其他改動,隻是建立了幾個分支。當然,如果你不想繼續使用 git-flow ,那麼隻需要簡單的停用 git-flow 的指令即可,不需要修改或者删除任何檔案。
為了驗證一下,我們看下目前的分支,執行:
1.git branch
輸出:
1.* develop
-
master
很簡單, develop 分支是我們日常開發的分支,會有很多改動。而 master 主要針對線上分支,下面會細說。
這裡補充一點,我們可以通過 help 指令來檢視用例。
1.git flow help
輸出如下:
1.usage: git flow
2.
3.Available subcommands are:
- init Initialize a new git repo with support for the branching model.
- feature Manage your feature branches.
- release Manage your release branches.
- hotfix Manage your hotfix branches.
- support Manage your support branches.
-
version Shows version information.
10.
11.Try 'git flow help' for details.
如果我要看 feature 相關指令呢?
1.git flow feature help
使用規範就會列出來:
1.usage: git flow feature [list] [-v]
- git flow feature start [-F] []
- git flow feature finish [-rFk]
- git flow feature publish
- git flow feature track
- git flow feature diff []
- git flow feature rebase [-i] []
- git flow feature checkout []
-
git flow feature pull []
三、分支模式
git-flow 模式會預設兩個主分支在倉庫中: 1. master 隻能用來包含産品代碼 我們不能直接工作在這個 master 分支上,而是在其他指定的,獨立的特性分支中。
不直接送出改動到 master 分支上也是很多工作流程的一個共同的規則。
2. develop 是你進行任何新的開發的基礎分支 當你開始一個新的功能分支時,它将是開發的基礎。另外,該分支也彙集所有已經完成的功能,并等待被整合到 master 分支中。
上面說到的這兩個分支被稱作為長期分支,它們會存活在項目的整個生命周期中。
而其他的分支,例如針對功能的分支,針對發行的分支,僅僅隻是臨時存在的。它們是根據需要來建立的,當它們完成了自己的任務之後就會被删除掉。
四、明确分支功能
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 分支是主要分支,主要分支每種類型隻能有一個,派生分支每個類型可以同時存在多個。
五、關于 Feature 分支
在 Git-flow 中,通過使用 Feature 分支,使得我們在同一時間開發多個分支更加簡單。 我們接到了一個 Test1 需求,使用 feature start 來啟動:
git flow feature start test1
當我們開始一個新的 feature 開發後:
1.Switched to a new branch 'feature/test1'
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.
-
git flow feature finish test1
我們自動切到了 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).
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
六、release 分支-版本釋出
當我們開發完畢,需要去釋出新版本的時候,我們可以使用:
1.git flow release start 0.1.0
控制台會有一些提示:
1.Switched to a new branch 'release/0.1.0'
4.- A new branch 'release/0.1.0' was created, based on 'develop'
5.- You are now on branch 'release/0.1.0'
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.
-
git flow release finish '0.1.0'
很清晰,我們簡單說一下: 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.
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).
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。
七、Hotfix 線上代碼
如果線上代碼有問題,這時候你需要緊急修複呢?
我們可以使用 git flow hotfix :
1.git flow hotfix start jartto
看一下執行了什麼:
1.Switched to a new branch 'hotfix/jartto'
4.- A new branch 'hotfix/jartto' was created, based on 'master'
5.- You are now on branch 'hotfix/jartto'
9.- Start committing your hot fixes
-
git flow hotfix finish 'jartto'
接着我們建立了目錄:
1.mkdir assets
放入一張圖檔,修改完畢,送出并結束 hotfix:
2.git commit -m 'fix: assets img'
3.git flow hotfix finish 'jartto'
看一下 git-flow 有哪些操作:
1.Switched to branch 'master'
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).
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 分支上去。
八、git-flow 流程圖示
恭喜你,到這裡你已經完成了 git-flow 的基本流程。為了更加整體的了解工作流,我們來看看下面這張流程圖:
Java
清清楚楚,是不是和我們上面的過程一模一樣。
九、參考
動力節點Java架構師班深度剖析Java底層原理,熱門技術深入探讨,前沿技術深入解讀,大項目實戰重構,從0到1做架構,從全局思維出發,帶你把控大型項目中别人忽略的重要細節節點,站在巨人肩膀上學習架構師,帶你領會架構師不一樣的視野