天天看點

Java程式員學習資料—Git Flow

在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.

  1.  git config --global user.email "[email protected]"
  2.  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

  1.  master

    很簡單, develop 分支是我們日常開發的分支,會有很多改動。而 master 主要針對線上分支,下面會細說。

這裡補充一點,我們可以通過 help 指令來檢視用例。

1.git flow help

輸出如下:

1.usage: git flow

2.

3.Available subcommands are:

  1.   init      Initialize a new git repo with support for the branching model.
  2.   feature   Manage your feature branches.
  3.   release   Manage your release branches.
  4.   hotfix    Manage your hotfix branches.
  5.   support   Manage your support branches.
  6.   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]

  1.       git flow feature start [-F] []
  2.       git flow feature finish [-rFk]
  3.       git flow feature publish
  4.       git flow feature track
  5.       git flow feature diff []
  6.       git flow feature rebase [-i] []
  7.       git flow feature checkout []
  8.       git flow feature pull []

    三、分支模式

git-flow 模式會預設兩個主分支在倉庫中: 1. master 隻能用來包含産品代碼 我們不能直接工作在這個 master 分支上,而是在其他指定的,獨立的特性分支中。

不直接送出改動到 master 分支上也是很多工作流程的一個共同的規則。

2. develop 是你進行任何新的開發的基礎分支 當你開始一個新的功能分支時,它将是開發的基礎。另外,該分支也彙集所有已經完成的功能,并等待被整合到 master 分支中。

Java程式員學習資料—Git Flow

上面說到的這兩個分支被稱作為長期分支,它們會存活在項目的整個生命周期中。

而其他的分支,例如針對功能的分支,針對發行的分支,僅僅隻是臨時存在的。它們是根據需要來建立的,當它們完成了自己的任務之後就會被删除掉。

Java程式員學習資料—Git Flow

四、明确分支功能

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.

  1.     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.

  1.     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

  1.     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程式員學習資料—Git Flow

Java

清清楚楚,是不是和我們上面的過程一模一樣。

九、參考

動力節點Java架構師班深度剖析Java底層原理,熱門技術深入探讨,前沿技術深入解讀,大項目實戰重構,從0到1做架構,從全局思維出發,帶你把控大型項目中别人忽略的重要細節節點,站在巨人肩膀上學習架構師,帶你領會架構師不一樣的視野