引用自:https://blog.csdn.net/j3T9Z7H/article/details/85271926git
最近在着手製定開發規範,想要把項目正規高效的跑起來。計劃引入 Git 版本控制,Git-Flow 便成爲了首選。由於以前並無過多接觸,因此先花些時間摸索一下。app
當在團隊開發中使用版本控制系統時,商定一個統一的工做流程是相當重要的。 不可避免的。ide
的確能夠在各個方面作不少事情,然而,若是在你的團隊中尚未能造成一個特定有效的工做流程,那麼混亂就將是基本套路:你能夠定義一個徹底適合你本身項目的工做流程,或者使用一個別人定義好的。測試
咱們使用 fetch
來安裝 :brew install git-flow
this
以後,經過 spa
來初始化項目:git flow init
.net
這時候就會有一些配置的操做,先默認操做:版本控制
Initialized empty Git repository in /Users/jartto/Documents/git-flow-demo/.git/
code
No branches exist yet. Base branches must be created now.
Branch name for production releases: [master]
Branch name for "next release" development: [develop]
*** Please tell me who you are.
Run
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
to set your account's default identity.
Omit --global to set the identity only in this repository.
fatal: unable to auto-detect email address (got 'jartto@bogon.(none)')
fatal: Not a valid object name: 'master'.
error: pathspec 'develop' did not match any file(s) known to git.
How to name your supporting branch prefixes?
Feature branches? [feature/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []
須要強調一點:git-flow 只是封裝了 git 的命令。
因此在咱們初始化的時候,對倉庫並無其餘改動,只是建立了幾個分支。固然,若是你不想繼續使用
,那麼只須要簡單的停用 的命令便可,不須要修改或者刪除任何文件。爲了驗證一下,咱們看下目前的分支,執行:
git branch
輸出:
* develop
master
很簡單,
分支是咱們平常開發的分支,會有不少改動。而 主要針對線上分支,下面會細說。這裏補充一點,咱們能夠經過 help 命令來查看用例。
git flow help
輸出以下:
usage: git flow <subcommand>
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.
Try 'git flow <subcommand> help' for details.
若是我要看
相關命令呢?git flow feature help
使用規範就會列出來:
usage: git flow feature [list] [-v]
git flow feature start [-F] <name> [<base>]
git flow feature finish [-rFk] <name|nameprefix>
git flow feature publish <name>
git flow feature track <name>
git flow feature diff [<name|nameprefix>]
git flow feature rebase [-i] [<name|nameprefix>]
git flow feature checkout [<name|nameprefix>]
git flow feature pull <remote> [<name>]
模式會預設兩個主分支在倉庫中: 1. 只能用來包含產品代碼 咱們不能直接工做在這個 分支上,而是在其餘指定的,獨立的特性分支中。
不直接提交改動到 master 分支上也是不少工做流程的一個共同的規則。
2.
是你進行任何新的開發的基礎分支 當你開始一個新的功能分支時,它將是開發的基礎。另外,該分支也聚集全部已經完成的功能,並等待被整合到 分支中。上面說到的這兩個分支被稱做爲長期分支,它們會存活在項目的整個生命週期中。
而其餘的分支,例如針對功能的分支,針對發行的分支,僅僅只是臨時存在的。它們是根據須要來建立的,當它們完成了本身的任務以後就會被刪除掉。
1.
分支 最爲穩定功能比較完整的隨時可發佈的代碼,即代碼開發完成,通過測試,沒有明顯的 ,才能合併到 中。請注意永遠不要在 分支上直接開發和提交代碼,以確保 上的代碼一直可用;2.
分支 用做平時開發的主分支,並一直存在,永遠是功能最新最全的分支,包含全部要發佈 到下一個 的代碼,主要用於合併其餘分支,好比 分支; 若是修改代碼,新建 分支修改完再合併到 分支。全部的 、 分支都是從 分支上拉的。3.
分支 這個分支主要是用來開發新的功能,一旦開發完成,經過測試沒問題,咱們合併回 分支進入下一個 。4.
分支 用於發佈準備的專門分支。當開發進行到必定程度,或者說快到了既定的發佈日,能夠發佈時,創建一個 分支並指定版本號(能夠在 的時候添加)。開發人員能夠對 分支上的代碼進行集中測試和修改 。(這個測試,測試新功能與已有的功能是否有衝突,兼容性)所有完成通過測試沒有問題後,將 分支上的代碼合併到 分支和 分支。5.
分支 用於修復線上代碼的 。從 分支上拉。完成 後,打上 咱們合併回 和 分支。須要注意:
全部開發分支從 分支拉。
全部 分支從 拉。
全部在 上的提交都必要要有 ,方便回滾。
只要有合併到 分支的操做,都須要和 分支合併下,保證同步。
和 分支是主要分支,主要分支每種類型只能有一個,派生分支每一個類型能夠同時存在多個。
在
中,經過使用 分支,使得咱們在同一時間開發多個分支更加簡單。 咱們接到了一個 需求,使用 來啓動:git flow feature start test1
當咱們開始一個新的
開發後:Switched to a new branch 'feature/test1'
Summary of actions:
- A new branch 'feature/test1' was created, based on 'develop'
- You are now on branch 'feature/test1'
Now, start committing on your feature. When done, use:
git flow feature finish test1
咱們自動切到了
分支下,正好開始咱們的開發,建一個文件先:vi main.js
寫入
接着提交咱們的變動:git add .
git commit -m 'feat: add console.log'
好了,如今咱們開發完了,結束 feature 開發:
git flow feature finish test1
控制檯輸出了:
Switched to branch 'develop'
Updating d975789..27e920c
Fast-forward
main.js | 1 +
1 file changed, 1 insertion(+)
create mode 100644 main.js
Deleted branch feature/test1 (was 27e920c).
Summary of actions:
- The feature branch 'feature/test1' was merged into 'develop'
- Feature branch 'feature/test1' has been removed
- You are now on branch 'develop'
這裏作了幾件事情: 1.將
分支合併到了 分支; 2.刪除了 ; 3.切換到 分支;須要注意:
使用的命令是:git merge —no-ff feature/test1
這樣,在咱們移除
分支以前,是不會丟失任何歷史記錄的。若是你還不瞭解
相關知識,能夠先看看:Git merge 的 –ff 和 –no-ff。接着,咱們看一下變動記錄:
git log --oneline
輸出:
27e920c (HEAD -> develop) feat: add console.log
d975789 (master) Initial commit
當咱們開發完畢,須要去發佈新版本的時候,咱們可使用:
git flow release start 0.1.0
控制檯會有一些提示:
Switched to a new branch 'release/0.1.0'
Summary of actions:
- A new branch 'release/0.1.0' was created, based on 'develop'
- You are now on branch 'release/0.1.0'
Follow-up actions:
- Bump the version number now!
- Start committing last-minute fixes in preparing your release
- When done, run:
git flow release finish '0.1.0'
很清晰,咱們簡單說一下: 1.基於
分支新建了 分支; 2.切換至 分支;又出現了新問題: 1.這是什麼意思:
2. 又是什麼意思?那接下來咱們要作什麼呢?不着急,按照提示一步步來。
咱們修改了代碼,進行add,和 commit 以後,執行:
git flow release finish 0.1.0
這個過程當中間可能出現異常:
fatal: no tag message?
Tagging failed. Please run finish again to retry.
輸出:
Switched to branch 'develop'
Merge made by the 'recursive' strategy.
test.js | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 test.js
Deleted branch release/0.1.0 (was 0426707).
Summary of actions:
- Latest objects have been fetched from 'origin'
- Release branch has been merged into 'master'
- The release was tagged '0.1.0'
- Release branch has been back-merged into 'develop'
- Release branch 'release/0.1.0' has been deleted
這裏主要有幾個操做: 1.首先,
會拉取遠程倉庫,以確保目前是最新的版本。 2.而後, 的內容會被合併到 和 兩個分支中去,這樣不只產品代碼爲最新的版本,並且新的功能分支也將基於最新代碼。 3.爲便於識別和作歷史參考, 提交會被標記上這個 的 。 4.清理操做,版本分支會被刪除,而且回到 。若是線上代碼有問題,這時候你須要緊急修復呢?
咱們可使用
:git flow hotfix start jartto
看一下執行了什麼:
Switched to a new branch 'hotfix/jartto'
Summary of actions:
- A new branch 'hotfix/jartto' was created, based on 'master'
- You are now on branch 'hotfix/jartto'
Follow-up actions:
- Bump the version number now!
- Start committing your hot fixes
- When done, run:
git flow hotfix finish 'jartto'
接着咱們新建了目錄:
mkdir assets
放入一張圖片,修改完畢,提交併結束
:git add .
git commit -m 'fix: assets img'
git flow hotfix finish 'jartto'
看一下
有哪些操做:Switched to branch 'master'
Merge made by the 'recursive' strategy.
assets/git-flow.png | Bin 0 -> 25839 bytes
1 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 assets/git-flow.png
Switched to branch 'develop'
Merge made by the 'recursive' strategy.
assets/git-flow.png | Bin 0 -> 25839 bytes
1 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 assets/git-flow.png
Deleted branch hotfix/jartto (was a734849).
Summary of actions:
- Latest objects have been fetched from 'origin'
- Hotfix branch has been merged into 'master'
- The hotfix was tagged 'jartto'
- Hotfix branch has been back-merged into 'develop'
- Hotfix branch 'hotfix/jartto' has been deleted
查看一下目前的
狀況:git tag
正是咱們上面添加的兩個標籤:
0.1.0
jartto
總結一下: 1.完成的改動會被合併到
中,一樣也會合併到 分支中,這樣就能夠確保這個錯誤不會再次出如今下一個 中。 2.這個 程序將被標記起來以便於參考。 3.這個 分支將被刪除,而後切換到 分支上去。恭喜你,到這裏你已經完成了
的基本流程。爲了更加總體的理解工做流,咱們來看看下面這張流程圖:清清楚楚,是否是和咱們上面的過程如出一轍。
https://www.git-tower.com/learn/git/ebook/cn/command-line/advanced-topics/git-flow
https://jeffkreeftmeijer.com/git-flow/
https://blog.csdn.net/aaaaaaliang/article/details/79451598
https://www.oschina.net/translate/a-successful-git-branching-model?print