我理解的Git Flow

Git FLow是什么

Git Flow是構(gòu)建在Git之上的一個組織軟件開發(fā)活動的模型,也是軟件開發(fā)過程中一種成功的分支管理策略。它的核心思想是利用成功的分支管理策略,管理軟件的開發(fā)過程。

2010年5月,nvie 在他的“A successful Git branching model”一文中,介紹了這種模型,并將其命名為Git Flow。而且,他還為這種分支策略開發(fā)了一套Git擴展工具,我們可以在Git中,使用專屬的分支管理命令操作分支。

因此,Git Flow 是一種軟件開發(fā)模型,由一種分支管理策略,和一套與之配套的Git擴展工具組成。

下面這張圖,形象的展示了Git Flow的全貌:

Git Flow中的分支

根據(jù)Git Flow的思想,開發(fā)人員需要合理的利用Git的分支功能,來管理軟件的開發(fā)流程。因此,Git FLow模型定義了五種標(biāo)準(zhǔn)的分支,并且讓它們各司其職,分別是:master分支,develop分支,feature分支,hotfix分支和release分支。

這五種分支又可分為兩大類:主要分支輔助分支。主要分支,包括master分支和develop分支。輔助分支,包括feature分支,hotfix分支和release分支。

實質(zhì)上,Git Flow就是要求開發(fā)者使用這五種標(biāo)準(zhǔn)的分支管理軟件開發(fā)流程

主要分支

主要分支只用于與軟件測試、部署、發(fā)布相關(guān)的活動,不會涉及任何的軟件開發(fā)活動。主要分支會一直存在,是所有其他分支的源頭,也是它們最終的歸宿。

  • master

    master分支上存放的應(yīng)該是隨時可供在生產(chǎn)環(huán)境中部署的代碼(Production Ready state)。它是源頭中的源頭,歸宿中的歸宿。它只用于新版本的發(fā)布,不涉及一切與軟件開發(fā)、測試、部署有關(guān)的操作。
  • develop

    develop分支fork自master分支,主要用于開發(fā)工作。開發(fā)新功能時,從develop分支拉出feature分支。新功能開發(fā)完成后,再把feature分支合并到develop分支??梢姡琩evelop分支是一個承上啟下的分支。

輔助分支

輔助分支主要用于具體的軟件開發(fā)工作,包括新功能的開發(fā)、Bug修復(fù)和發(fā)布前的準(zhǔn)備工作。輔助分支不是一直存在的,當(dāng)它們被合并到主要分支后,會被刪除掉。

  • feature

    開發(fā)者不能直接在master分支和develop分支上做開發(fā)工作,這樣可能會污染軟件的版本庫。Git Flow要求從develop分支上引出一條feature分支,專門做具體的開發(fā)工作。每個開發(fā)者都可以從develop分支上引出自己的feature分支,并且這個feature分支是開發(fā)者私有的,可以不必提交到版本庫中。開發(fā)完成后,把所有的feature分支都合并到develop分支上,然后把feature分支刪掉。如果新功能被砍掉了,也可以直接刪掉feature分支。

  • hotfix

    當(dāng)線上產(chǎn)品遇到了嚴(yán)重Bug,或者發(fā)現(xiàn)了緊急的缺陷,不得不立即修復(fù)時,就可以從master分支引出一條hotfix分支。問題解決后,再把hotfix分支合并到master分支和develop分支,最后刪除掉這個hotfix分支。
    這樣做的好處是使Bug修復(fù)與新功能開發(fā)完全分離開,保證開發(fā)工作不受到影響。

  • release

    當(dāng)新功能開發(fā)完,代碼都合并到develop分支后,就可以為新版本發(fā)布做準(zhǔn)備了。但是如果這時有新的開發(fā)任務(wù)到來,或者又有新的分支需要合并,而此時的develop分支又沒有準(zhǔn)備好合并到master分支時,那么就可以從develop分支引出一條release分支作為過渡。在release分支上,完成發(fā)布前的準(zhǔn)備工作,然后合并到master分支和develop分支,最后刪除release。
    release分支可以使develop分支解放出來,盡早的投入到下一版本的開發(fā)中。

Git FLow的使用方式

  • 使用原生的Git命令

    Git Flow本質(zhì)上就是對git分支的利用,所以用原生的git分支命令就可以操作。
    • 創(chuàng)建分支
      從當(dāng)前分支上引出新的分支

        git branch branch_name
      
    • 切換分支

        git checkout branch_name
      
    • 創(chuàng)建并切換分支

        git checkout -b branch_name
      
    • 合并分支
      把其他分支合并到當(dāng)前分支

        git merge --no-ff -m "comment" branch_name
      
    • 刪除分支

      • 要想刪除一個分支,必須在已經(jīng)合并了那個分支的分支上執(zhí)行刪除操作。

          git branch -d banch_name
        
      • 強制刪除一個分支

          git branch -D branch_name
        
    • 查看所有分支

        git branch
      
    • 如果本地沒有遠(yuǎn)程倉庫的某個分支,把遠(yuǎn)程分支拉取到本地,并且建立連接

        git checkout -b branch_name orign/branch_name
      
    • 從遠(yuǎn)程分支更新本地分支

        git pull
      
    • 推送分支到遠(yuǎn)程分支
      把本地分支的更新推送到遠(yuǎn)程分支(需要先建立連接);或者在遠(yuǎn)程倉庫?沒有此分支時,把本地分支?推送到遠(yuǎn)程倉庫

        git push origin branch_name
      
    • 使本地分支與遠(yuǎn)程分支建立連接

        git branch --set-upstream branch_name origin/branch_name
      
  • 刪除遠(yuǎn)程倉庫的分支

         git push origin --delete branch_name
    
  • 使用 nvie 開發(fā)的Git Flow工具

    nvie為Git Flow提供了一套命令行工具,使用它可以更方便的操作Git Flow.
    • 初始化Git Flow

        git flow init
      
      • 在一個git倉庫中初始化git flow,會彈出一系列提示信息,跟著做就行了。
      • 在一個非git倉庫的文件夾中初始化,會創(chuàng)默認(rèn)建好需要的分支,沒有任何提示
    • 創(chuàng)建feature/release/hotfix/support分支
      初始化Git Flow會自動創(chuàng)建/指定主要分支,但輔助分支需要開發(fā)者手動創(chuàng)建。

      • 查看/創(chuàng)建/完成feature分支

          git flow feature
          git flow feature start feature_branch_name
          git flow feature finish feature_branch_name
        

        start命令,會創(chuàng)建一個新的feature分支;finish命令,會自動合并feature分支到develop分支和master分支,并刪除feature分支。

      • push/pull一個feature分支到遠(yuǎn)程倉庫

          git flow feature publish feature_branch_name
          git flow feature pull origin feature_branch_name
        
      • 其他分支 - hotfix/release/support分支的操作與feature分支基本相同,直接去參考官方文檔吧。

參考文獻(xiàn):

  1. 基于git的源代碼管理模型——git flow
  2. Git 常用命令和 Git Flow 梳理
  3. Git flow 分支策略
  4. Git Flow在github的主頁
撤銷更改

git checkout -- file 在加入到暫存區(qū)之前,遺棄修改
git reset HEAD file 在提交之前,遺棄暫存區(qū)的更改
git reset --hard HEAD^ 回退到上一版本
git reset --hard commit_id 回退到指定的版本

操作文件

git mv file newfile 重命名,文件名不區(qū)分大小寫
git rm file 刪除文件
git remote rename repo new_repo 重命名遠(yuǎn)程倉庫

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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