git flow 使用規(guī)范

Git的優(yōu)點(diǎn)

  • 分布式,本地包含遠(yuǎn)程倉(cāng)庫(kù)所有源碼,可以離線操作

  • 便捷的分支功能,可以很方便的進(jìn)行團(tuán)隊(duì)合作和版本控制

Git flow

  • Git flow 是前人經(jīng)過(guò)探索總結(jié)出來(lái)的一套Git分支管理規(guī)范和流程,來(lái)保證我們?cè)陂_(kāi)發(fā)過(guò)程少踩一些坑。

首先,項(xiàng)目存在兩個(gè)長(zhǎng)期分支,前者用于存放對(duì)外發(fā)布的版本,任何時(shí)候在這個(gè)分支拿到的,都是穩(wěn)定的分布版;后者用于日常開(kāi)發(fā),存放最新的開(kāi)發(fā)版。


兩條長(zhǎng)期維護(hù)分支

主分支master :

主分支 , 產(chǎn)品的功能全部實(shí)現(xiàn)后 , 最終在master分支對(duì)外發(fā)布;
該分支為只讀唯一分支 , 只能從其他分支(release/hotfix)合并 , 不能在此分支修改;
另外所有在master分支的推送應(yīng)該打標(biāo)簽做記錄,方便追溯;

開(kāi)發(fā)分支develop :

主開(kāi)發(fā)分支 , 基于master分支克??;該分支為只讀唯一分支 , 只能從其他分支合并;
包含所有要發(fā)布到下一個(gè)release的代碼; feature功能分支完成 , 合并到develop(不推送而是merge);
develop拉取release分支 , 提測(cè); release/hotfix 分支上線完畢 , 合并到develop并推送;

其次,項(xiàng)目存在三種短期分支。


分支維護(hù)過(guò)程

功能分支(feature branch):

功能開(kāi)發(fā)分支 , 基于develop分支克隆 ;
功能開(kāi)發(fā)完畢后合到develop分支;主要用來(lái)開(kāi)發(fā)新功能,每個(gè)功能新開(kāi)一個(gè)feature,保證功能的獨(dú)立性;
feature分支可同時(shí)存在多個(gè) , 用于團(tuán)隊(duì)中多個(gè)功能同時(shí)開(kāi)發(fā) , 屬于臨時(shí)分支 , 功能完成后可選刪除;
(未正式上線之前不推送到遠(yuǎn)程中央倉(cāng)庫(kù)!!!)
分支命名: feature/ 開(kāi)頭的為特性分支, 命名規(guī)則: feature/user_module、 feature/cart_module

補(bǔ)丁分支(hotfix branch):

補(bǔ)丁分支 , 基于master分支克隆 , 主要用于對(duì)線上的版本進(jìn)行BUG修復(fù);
修復(fù)完畢后合并到develop/master分支并推送 , 打Tag;
屬于臨時(shí)分支 , 補(bǔ)丁修復(fù)上線后可選刪除;
分支命名: hotfix/ 開(kāi)頭的為修復(fù)分支,它的命名規(guī)則與 feature 分支類似;

預(yù)發(fā)分支(release branch):

測(cè)試分支 , 基于feature分支合并到develop之后  , 從develop分支克隆;
屬于臨時(shí)分支 , 功能上線后可選刪除
主要用于提交給測(cè)試人員進(jìn)行功能測(cè)試 , 測(cè)試過(guò)程中發(fā)現(xiàn)的BUG在本分支進(jìn)行修復(fù) ,
修復(fù)完成上線后合并到develop/master分支并推送(完成功能) , 打Tag;
分支命名: release/ 開(kāi)頭的為修復(fù)分支;

易錯(cuò)操作:

1、feature分支一旦合并到develop后不能再再該feature上修改了,
如果要改的話只能在合并后的develop上拉release進(jìn)行修改,
這就是為什么未正式上線之前不推送到遠(yuǎn)程中央倉(cāng)庫(kù)!!!    
2、在release合并到develop分支前,不能把feature2合并到develop,這樣會(huì)造成混亂。

常用命令:

1、 創(chuàng)建功能分支

創(chuàng)建功能分支
(develop)$: git checkout -b feature/xxx               # 從dev建立特性分支
(feature/xxx)$: blabla                                # 開(kāi)發(fā)
(feature/xxx)$: git add .                             #添加到暫存區(qū)
(feature/xxx)$: git commit -m 'blabla'    #提交備注

2、功能完成,把功能合并到develop


把功能合并到develop
(feature/xxx)$: git checkout develop                  # 切換至develop分支
(develop)$: git pull                                  #一定要先更新develop,再去merge代碼
(develop)$: git merge feature/xxx
(develop)$: git push                                  #建議再編輯器里查看沖突文件,解決后再push
git branch -d feature/xxx                             #功能分支代碼合并到develop后就沒(méi)用了,如果接下來(lái)還要修改問(wèn)題到對(duì)應(yīng)到release分支進(jìn)行修改        

3、功能準(zhǔn)備發(fā)布


功能準(zhǔn)備發(fā)布
(develop)$: git checkout -b release/xxx                #這個(gè)分支專門(mén)用于發(fā)布前的準(zhǔn)備,包括一些清理工作、全面的測(cè)試、文檔的更新以及任何其他的準(zhǔn)備工作。它與用于功能開(kāi)發(fā)的分支相似,不同之處在于它是專為產(chǎn)品發(fā)布服務(wù)的。

4、發(fā)布完成


release測(cè)試通過(guò)后合并到master和develop
(release/xxx )$: git checkout master
(master)$: git merge release-0.1
(master)$: git push
(master)$: git checkout develop
(develop)$: git merge release-0.1
(develop)$: git push
(develop)$: git branch -d release-0.1          

發(fā)布分支扮演的角色是功能開(kāi)發(fā)(develop)與官方發(fā)布(master)之間的一個(gè)緩沖。無(wú)論什么時(shí)候你把一些東西合并入master,你都應(yīng)該隨即打上合適的標(biāo)簽。

(master)$: git tag -a Verson1.0 -m"Initial public release"            #一般在提交的時(shí)候打標(biāo)簽
(master)$: git push --tags

5、線上bug修復(fù)
線上產(chǎn)生bug,新建hotfix分支進(jìn)行修復(fù),步驟和創(chuàng)建feature分支相同


hotfix
(master)$: git checkout -b hotfix/xxx
(hotfix/xxx)$: # Fix the bug
(hotfix/xxx)$: git checkout master
(master)$: git merge hotfix/xxx
(master)$: git push

(master)$: git checkout develop
(develop)$: git merge hotfix/xxx
(develop)$: git push
(develop)$: git branch -d hotfix/xxx

Git Flow使用:

Git Flow
  • 初始化:
    這個(gè)命令會(huì)進(jìn)行一些默認(rèn)的配置,可以自動(dòng)創(chuàng)建上面介紹的所有分支:master、develop、feature、relase、hotfix等分支。完成后當(dāng)前所在分支就變成 develop. 任何開(kāi)發(fā)都必須從 develop 開(kāi)始
    git flow init

  • 開(kāi)始新Feature:
    git flow feature start some_awesome_feature

  • 發(fā)布新特性分支到遠(yuǎn)程服務(wù)器(也就是push到遠(yuǎn)程):
    git flow feature publish some_awesome_feature

  • 取得其它用戶發(fā)布的新特性分支,并簽出遠(yuǎn)程的變更:
    git flow feature pull origin some_awesome_feature

  • 完成一個(gè)Feature:
    該命令將會(huì)把feature/some_awesome_feature合并到develope分支,然后刪除功能(feature)分支。
    git flow feature finish feature/some_awesome_feature

  • 開(kāi)始一個(gè)Release:
    當(dāng)你的功能點(diǎn)都完成時(shí)(需要發(fā)布新版本了),就基于develop創(chuàng)建一個(gè)發(fā)布(release)分支。
    你可以選擇提供一個(gè) [BASE]參數(shù),即提交記錄的 sha-1 hash 值,來(lái)開(kāi)啟動(dòng) release 分支. 這個(gè)提交記錄的 sha-1 hash 值必須是'develop' 分支下的
    git flow release start RELEASE [BASE]

  • Publish一個(gè)Release:
    git flow release publish RELEASE

  • 發(fā)布Release:
    別忘了git push --tags,標(biāo)簽打在release分支上
    git flow release finish RELEASE

  • 開(kāi)始一個(gè)Hotfix:
    git flow hotfix start VERSION [BASENAME]

  • 發(fā)布一個(gè)Hotfix:
    git flow hotfix finish VERSION

Git WorkTree應(yīng)用:

1、應(yīng)用場(chǎng)景:
 a)我在 feature 分支開(kāi)發(fā)得多些,但總時(shí)不時(shí)被高優(yōu)先級(jí)的 BUG 打斷需要臨時(shí)去 develop 分一個(gè)分支出來(lái)解 BUG。
 b)不同分支依賴的node_module包可能不同,打包發(fā)布時(shí),可能因?yàn)榍袚Q分支但是包沒(méi)有及時(shí)更新(被ignore),導(dǎo)致打包不成功
2、解決方法:git 2.6 以上開(kāi)始提供了 worktree 功能,可以解決這樣的問(wèn)題
3、使用方法:

git worktree add -b <新分支名> <新路徑> <從此分支創(chuàng)建>

git worktree add -b myNewBranch ../testDir master

這樣,原本的倉(cāng)庫(kù)文件夾的同級(jí)目錄下會(huì)出現(xiàn)一個(gè) testDir文件夾。這個(gè)倉(cāng)庫(kù)里只有一個(gè) .git 文件用來(lái)記錄這是主倉(cāng)庫(kù)的一個(gè)工作目錄。

相比于克隆多個(gè)倉(cāng)庫(kù),使用這種方法創(chuàng)建的多個(gè)目錄,有諸多好處:
只有一個(gè)倉(cāng)庫(kù)會(huì)占用版本庫(kù)的空間,其它只占用工作目錄的空間,對(duì)大型項(xiàng)目而言非常節(jié)省空間。
因?yàn)樗泄ぷ髂夸浌蚕硪粋€(gè)倉(cāng)庫(kù),所以一個(gè)更新意味著整個(gè)更新(A 目錄里對(duì)分支做的改動(dòng),B 目錄里切到此分支也是改動(dòng)后的;避免到時(shí)候找不到某個(gè)未推送的改動(dòng)改到了哪個(gè)倉(cāng)庫(kù))

4、刪除方法:

如果要?jiǎng)h除其中一個(gè)工作目錄,直接刪除文件夾即可。隨后使用命令清除多余的已經(jīng)被刪的工作目錄:
git worktree prune

5、本地git樹(shù)清除緩存:

git remote prune origin

我的Git 常用命令:

1、 tag標(biāo)簽
  • 顯示所有的tag標(biāo)簽 git tag
  • 查看某個(gè)版本系列的縮略tag git tag -l 'v1.0.*'
  • 查看某個(gè)版本系列的詳細(xì)tag git show v0.0.6 可以看到你commit的內(nèi)容
  • 創(chuàng)建標(biāo)簽 git tag -a v1.0.0 -m "內(nèi)容:v1.0.0"
  • 推送標(biāo)簽 git push origin v1.0.0
  • 刪除標(biāo)簽 刪除本地:git tag -d v1.0.0 刪除遠(yuǎn)程:git push origin :refs/tags/v1.0.0
2、 刪除node_modules并清除緩存
  • 刪除node_module rm -rf node_modules
  • 清除緩存 npm cache clear --force
  • 重新安裝依賴 npm install --no-shrinkwrap --update-binary
3、 回滾
  • 查看提交節(jié)點(diǎn) git log
  • 本地強(qiáng)制回滾到某個(gè)節(jié)點(diǎn) git reset --hard 12asddf123fsd34fsdfdf
  • 遠(yuǎn)程強(qiáng)制回滾 git push -f
4、git刪除遠(yuǎn)端文件/文件夾(因?yàn)間ithub/gitlab沒(méi)有直接刪除文件夾的操作)
  • 先到你需要修改的文件下
  • 刪除遠(yuǎn)端對(duì)應(yīng)的文件夾,本地不會(huì)刪除 git rm -r --cached '文件名/文件夾名'
  • git commmit -m '提交'git push...
5、git 開(kāi)啟/關(guān)閉文件大小寫(xiě)鑒別(默認(rèn)關(guān)閉,不推薦一直開(kāi)啟,可以在修改文件需要提交的時(shí)候開(kāi)啟,提交后再關(guān)掉)
  • 開(kāi)啟區(qū)分大小寫(xiě):git config core.ignorecase false
  • 關(guān)閉區(qū)分大小寫(xiě):git config core.ignorecase true
6 、修改本地文件名大小寫(xiě)并推送到遠(yuǎn)端(不要跟我說(shuō)你可以直接修改文件夾名字然后push)

舉個(gè)例子:把Add文件夾改成add文件夾,由于window或者在一些開(kāi)發(fā)工具里不支持把Add直接改成同名只是大小寫(xiě)不一樣的文件,所以需要先改成add_,然后在改成add

  • 按照上一步的操作打開(kāi)git的區(qū)分大小寫(xiě)
  • cd進(jìn)入到需要修改的文件夾的上一級(jí)
  • Add文件夾改成add_ : git mv Add add_
  • 再把add_ 文件夾改成add : git mv add_ add
  • git commmit -m '提交' 、git push...
7 、報(bào)錯(cuò):似乎另外一個(gè) git 進(jìn)程在這個(gè)倉(cāng)庫(kù)中運(yùn)行,例如:'git commit' 命令打開(kāi)了一個(gè)編輯器...
  • rm -f ./.git/index.lock
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容