摘要:如上圖,該圖沒有現成的,所以是在大師原有的上修改出來的我們在開發過程中,通常以當天下午下班前十分鐘為節點,合并當日修復的代碼到分支另外要說的就是分支的命名了,通常我們已即將發布的版本號為后綴添加到后面,例如等等。
首發公眾號:Android程序員日記
作者:賢榆的榆
如果你覺得有幫助歡迎關注、贊賞、轉發
閱讀時間:5622字 15分鐘
通常當我們在進行一個正式項目的時候,一定的分支管理是必要,這里推薦大家閱讀兩篇文章,我自己也是從這兩篇文章中受益匪淺。
第一篇是國外行家Vincent Driessen 的《A successful Git branching model》
地址:https://nvie.com/posts/a-succ...第二篇阮一峰老師的《Git分支管理策略》
地址:http://www.ruanyifeng.com/blo...
其實阮一峰老師寫了關于git的一個系列文章。如果對git還不太熟悉的,非常推薦閱讀,圖文并茂,淺顯易懂!
好了,那么接下來,我就站在前人的肩膀上結合這自己的實踐,來簡單介紹一下上面兩篇文章中提到的分支管理策略吧。我們先來看一張圖哪位外國哥們的圖。
小聲聲明:這部分幾乎所有的圖片都引用自《A successful Git branching model》這篇博客。
看圖的最上面,出現了feture branches、develop、release branches、hotfixes、master。看似總共五種分支,但其實這其中歸納一下只有兩種:
一種是主要分支
一種是臨時分支
主要分支那么我們先來說一下主要分支。從上面的圖里,其實我們也不難看出來,develop和master 是兩個主干分支。與臨時分支的唯一區別時,他們包含了所以其他臨時分支的提交。
1、master分支在主要分支中,master是在我們運行git init 之后就會默認生成的分支,所以我們的其他所以分支的起點應該都是從master分支check出去的。另外我們通常也正是用這個master分支也用來記錄我們的每一個生產版本,所以每一次合并其他分支到mater分支時,都應該非常的謹慎。
2、devleop分支在主要分支中,develop是我們的開發分支,是從master 切出來的。而最終當我們開發完成之后,我們都一定會將其合并回master,然后打出一個生產包,在用tag標記一個版本的發行。master與develop分支的關系圖如下:
又一個git 命令可以學一下
//在develop分支下運行下面命令 git push origin develop
將本地develop分支推送至遠端倉庫,如果遠端沒有develop會自動創建!
臨時分支主要分支說完了,那我們聊一聊臨時分支吧。在Vincent Driessen的那篇文章中,稱之為Supporting branches(支持分支)。其實都是一樣的了,他按照分支的作用來歸類命名。我是根據分支的生命周期的角度給了此命名。通過對這組分支的命名大家應該都已經了解到了。臨時分具有一定的實效行,它往往承載的是一段時間里的一件獨立的事。所以這里我們通常分出了三種:
feature(功能分支)
hotfix(bug修復分支)
release-(發布版分支)
1、feature(功能分支)先說說功能分支吧。通常我們從develop分支上切出一個新的分支來開發一個新的功能,并且我們通常以該功能命名。比如在我最近的一個項目中做了一個消息通知的功能,于是我切了一個新的分支叫inform。最后當我們將該功能開發完之后仍會將其合并到devleop分支。當然如果只有一個人那似乎用不用功能分支都不重要。所以分支管理最重要的是進行更好的團隊協作,達到到敏捷迭代,高效開發,在技術層面快速占領市場。下面是feature與devleop的關系圖,注意這里的branches是復數,哈哈,細節很重要:
介紹一下在這個過程中可能會用的git指令。
在開發過程中會用到的:
//從devleop切出一個新的分支命名為 //feature_name(這個名字你可以自定義) git checkout -b feature_name develop //檢查項目中是否有未進行版本控制和已修改的文件 git status //將項目當前目錄下所有文件到暫存區 git add . //提交暫存取里的代碼到本地庫 git commit -m"提交log" //當然你也可能會用到上面講到過的一個命令 //這個只取決于你是否想將這個臨時分支,推送到遠程服務器進行管理 git push origin feature_name
在功能分支開發完成之后會用到的:
//切換回develop分支 git checkout develop //將feature_name分支合并到develop git merge --no-ff feature_name // 刪除本地的feature_name 分支 git branch -d feature_name //將develop分支推送到遠端服務器,一定要先pull再push git pull origin develop git push origin develop
這里merge 后面跟了--no-ff ,加不加它有什么區別呢,我們現在這里賣個關子,在文章最后,會進行補充說明。
2、release(預發布分支)release是一個預發布分支。在一個迭代中,當我們完成了一個或者幾個小功能之后,我們會把feature 分支們都合并到develop分支上,這時develop分支其實就可以作為一個預發布分支了。但是如果還有其他小伙伴正在開發下一個迭代發布的功能。那么極有可能出現一種情況,就是他在功能分支上面開發完成了,卻無法合并到develop分支上,因為此時的develop分支已經同時承載了預發布階段的性能優化、bug修復并等代發布上線等任務,是不能夠合并其他分支的代碼的。所以這個時候我們就非常需要從develop分支牽出一個新的分支來作為完成我們預發布階段的相關功能。而這就是我們的release分支了。所以release分支也會在這期間將修復后的代碼頻繁的合并到develop分支上。(如上圖,該圖沒有現成的,所以是在大師原有的keynote上修改出來的)我們在開發過程中,通常以當天下午下班前十分鐘為節點,合并當日修復的代碼到develop分支!
另外要說的就是release分支的命名了,通常我們已即將發布的版本號為后綴添加到release-后面,例如:release-2.0.0、release-2.2.2等等。
介紹一下release分支生命周期中可能會用的git指令流程。
//首先從develop分支牽出release-1.0.0分支 git checkout -b release-1.0.0 //接著我們會檢查、添加到緩存區、提交到本地 git status git add . git commit -m"修復bug2018" //確認release-1.0.0的分支沒有問題了,我們就將分支合并到master分支 git checkout master git merge --no-ff release-1.0.0 //在master分支上打上tag git tag -a v1.0.0 -m"release v1.0.0" # -a:后面跟的是標簽名; # -m:后面跟的是改標簽的說明(一般可以不用加-m) //推送master分支和tag到遠程 git pull origin master git push origin master git push --tags //合并分支到develop git checkout develop git merge --no-ff release-1.0.0 //最后可以刪除分支然后推送develop到遠程了。 git branch -d release-1.0.0 git pull origin develop git push origin develop3、hotfix(bug修復分支)
最后我們來了解一下bug修復分支,這個翻譯過來就是熱修復分支。估計是想強調線上bug修復,我們需要開分支來進行修復線上bug的。其實bug修復分支和上面講到的預發布分支幾乎是一個類型的。不同的地方無非是,bug修復分支是在發布后修復線上bug,所以要從已經發布的master分支上牽出hotfix分支。而release分支是在發布之前來進行bug修復,所以從develop分支錢出來。但他們最終合并的時候都是要合并到master再合并到develop分支的。而最后,他們在完成了各自的使命之后,都是可以刪除的臨時分支!
關于hotfix 的命名,大家也可以參考這release分支的命名來!如果我們是修復1.0.0 的線上版本,那么修復之后的版本號應該是是1.0.1,那么我們就可以給這個hotfix 分支取名為hotfix-1.0.1
即:hotfix- + 即將發布的版本號
這個也是僅供參考,如果你有更好的方案,也歡迎在公眾號后臺留言給我!
在bug 修復分支的生命周期里,我們會用的git操作其實和release分支大致是一樣的,不過這里也還是在羅列一下,也是大家可以看著git的變化,把握它們的邏輯!
//首先從develop分支牽出release-1.0.0分支 git checkout -b hotfix-1.0.1 //修復完成后去檢查、添加到緩存區、提交到本地 git status git add . git commit -m"修復線上bug" //確認hotfix-1.0.1的分支測試通過,我們就將分支合并到master分支 git checkout master git merge --no-ff hotfix-1.0.1 //在master分支上打上tag git tag -a v1.0.1 -m"hotfix-v1.0.1" # -a:后面跟的是標簽名; # -m:后面跟的是改標簽的說明(一般可以不用加-m) //推送master分支和tag到遠程 git pull origin master git push origin master git push --tags //合并分支到develop git checkout develop git merge --no-ff hotfix-1.0.1 //最后可以刪除hotfix-1.0.1分支然后推送develop到遠程了。 git branch -d hotfix-1.0.1 git pull origin develop git push origin develop補充——merge的三種模式
看到這里,關于git 分支的管理模型就已經了解的差不多了額,接下來也該填一下前面挖下的坑了。相信早就有同學疑問,為什么我們的merge 使用的是git merge --no-ff 而不是直接用git merge 。其實除了這兩種我們還有一種git merge —squash。這里我們就來區分一下吧!
先看圖(改圖最左邊的圖由我本人補充)
1、git merge feature
默認fast-forward 模式,如上圖最右邊的分支合并,不是沒有合并,develop分支的HEAD 直接指給了feature分支的HEAD 然后就呈現了這樣的狀態,但這種合并是有條件的——當我們從develop分支切出feature分支開始,到feature分支開發完合并到develop分支之前,develop分支都不能有新的提交,才會使用fast-forward模式進行合并。否則即使你用這個命令也會讓你以第二種模式合并。
2、git merge --no-ff feature
--no-ff ,看著命令再結合前面提到的默認模式。基本已經猜出其意思了,就是強行關閉fast-forward。如上圖中中間的哪一組分支合并圖。當我們使用這種模式進行合并的時候,它就會創建出一個新的合并分支節點作為當前分支的HEAD。用這種方式,我們能夠更清晰看到分支完成的內容和分支的起止時間。所以更多的時候我們是推薦使用這種合并方式的。
注:當我們在命令行里執行了上面的合并命令后,會彈出上圖所示內容。這是通過Vim去修改本次提交的備注。它默認給的是Merge branch "feature" into develop 一般我都用默認,不修改,直接輸入:wq然后回車就保存退出了
3、git merge --squash feature
這個模式是將feature分支上的左右的改動提交都合成一個點作為develop的一次commit。通常我們使用的場景是如果我們切出一個分支來修復bug 然后出現了很多的補充提交和小改動的提交,看起來這些都很冗余沒有必要,那么我們就可以用這種模式。該模式提交完了的最終形態有點像fast-forward模式。并且它不同于上面兩種模式的一點是,你執行了這個命令之后,只是把 feature分支上的所有改動都移植到了develop分支上的相應文件上。接下來我們還需要自己再手動 add . --> commit 一次。可以配合分支合并圖的最左邊的示意圖理解一下!
好了總算把Git分支管理模型這塊說完了。在前面兩篇分享中,有小伙伴說要跟著這個一起擼。這確實是個不錯的主義,只是這次的內容沒有太多讓大家擼的。但是在這里還是強烈建議大家新建一個GitDemo項目好好理解一下這樣的一個git 分支管理模型。雖然在后面的文章中我也會用這套模型來進行git 分支管理,但是畢竟我是一個人在寫,所以并不能很好的模擬多人開發的分支管理,所以理解這個模型,大家還是需要親力親為的!
這篇文章就到這里吧,另外啰嗦兩句,這個系列的文章基本會涉及到我們開發到上線整個流程的內容,所以有的時候像這篇文章一樣,寫一些需要我們在開發過程中應該有一定認知的東西,而不僅僅停留在一些代碼上。
好了,下一篇應該會寫一些開發過程中能夠提高我們工作效率的一些插件。你可以在我的公眾號下面回復「Settings」,提前拿到我的Android Studio的配置導入到自己的Android Studio里了解一下!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/76687.html
閱讀 2084·2023-04-25 19:03
閱讀 1235·2021-10-14 09:42
閱讀 3414·2021-09-22 15:16
閱讀 1000·2021-09-10 10:51
閱讀 1577·2021-09-06 15:00
閱讀 2409·2019-08-30 15:55
閱讀 491·2019-08-29 16:22
閱讀 901·2019-08-26 13:49