Git開發(fā)流程整理

Git分支管理

  • master:主分支训挡,當(dāng)前分支上的代碼隨時可以直接發(fā)布尘执,并且只能通過Pull Request從其他分支進(jìn)行合并誊锭,而不能直接push修改。當(dāng)開發(fā)告一段落蟆沫,產(chǎn)生了新的可供發(fā)布的代碼時温治,master分支通過Pull Request更新了代碼熬荆,同時,每一次更新必須添加對應(yīng)版本號的標(biāo)簽TAG累盗。

  • develop:開發(fā)分支突琳,保存當(dāng)前最新開發(fā)成果的分支拆融,即當(dāng)一個新功能開發(fā)完畢需要先合并到develop分支,這個分支的代碼會進(jìn)行每日的代碼持續(xù)集成(Daily Build)傲须。所有的開發(fā)任務(wù)都是從這個分支Checkout新的特性分支進(jìn)行開發(fā)

  • feature:特性分支泰讽,當(dāng)開發(fā)新的功能時,從develop分支Checkout新的feature分支,這個分支的代碼最終要合并回develop分支或者廢棄掉(例如預(yù)研功能效果不好時)咬最。feature分支最好以功能為單位欠动。

  • release:發(fā)布分支具伍,從develop分支上派生出來的分支。

    當(dāng)develop分支上的代碼已經(jīng)包含了所有即將發(fā)布的所有功能且通過所有測試時望几,就可以創(chuàng)建release分支用來準(zhǔn)備發(fā)布萤厅。

    當(dāng)準(zhǔn)備好正式上架或者發(fā)布到生產(chǎn)環(huán)境時惕味,release分支合并到master分支和develop分支,并且在master分支上添加標(biāo)簽標(biāo)記版本號疟羹,最后刪除release分支榄融。

    通過創(chuàng)建release分支蹋艺,可以讓develop分支空閑出來接受其它新的feature分支的代碼合并捎谨,進(jìn)入新的功能開發(fā)周期,其它feature分支不用為了等待develop分支的發(fā)布而無法合并到develop分支中畏邢,而且在發(fā)布準(zhǔn)備過程中检吆,如果發(fā)現(xiàn)新的bug或者有修改蹭沛,可以直接在release分支中修改章鲤,而不用擔(dān)心影響從其它feature分支合并到develop分支的代碼败徊。release分支最后必須合并回develop分支掏缎,并且發(fā)送Pull Request到master分支且添加標(biāo)簽(TAG)眷蜈。在release分支上只能進(jìn)行一些發(fā)布必要的bug修復(fù)或者修改,不要做任何于要發(fā)布的功能無關(guān)的新的特性的開發(fā)辜妓,新的特性必須創(chuàng)建新的特性分支嫌拣。

  • hotfix:緊急修復(fù)分支呆躲,唯一從master分支派生的分支插掂,當(dāng)生產(chǎn)環(huán)境中發(fā)現(xiàn)了異常或者缺陷的時候酝润,從master分支上指定的TAG版本Checkout hotfix分支進(jìn)行緊急修復(fù)工作要销,當(dāng)修復(fù)完成之后夏块,必須同時合并到master分支和develop分支。合并完代碼之后刪除hotfix分支浑塞。

分支開發(fā)流程

  1. 首先將代碼下載到本地酌壕,如果本地已經(jīng)有代碼則直接進(jìn)入下一步:

    git clone https://github.com/lijinzhe/gittest.git
    
  2. 查看所有分支,這時最少會看到3個分支果港,一個本地分支master分支京腥,和兩個遠(yuǎn)程分支origin/masterorigin/develop分支:

    git granch -a
    

    顯示結(jié)果如下:

    * master
      ...
      //更多本地分支
      
      remotes/origin/HEAD -> origin/master
      remotes/origin/master
      remotes/origin/develop
      ...
      //更多遠(yuǎn)程分支
    
  3. 確認(rèn)是否有本地develop分支,如果沒有則從遠(yuǎn)程orgin/develop分支檢出到本地develop分支:

    git checkout --track origin/develop
    

    然后查看所有分支:

    git granch -a
    

    顯示結(jié)果如下:

    * develop
      master
      ...
      //更多本地分支
      
      remotes/origin/HEAD -> origin/master
      remotes/origin/master
      remotes/origin/develop
      ...
      //更多遠(yuǎn)程分支
    
  4. 現(xiàn)在開發(fā)新功能船侧,先創(chuàng)建新的遠(yuǎn)程特性分支厅各,比如開發(fā)登錄功能队塘,則創(chuàng)建遠(yuǎn)程特性分支origin/feature-login分支憔古,步驟如下:

    git checkout develop //切換本地分支到develop分支
    git pull //拉取遠(yuǎn)程Git倉庫中的最新的develop分支的代碼
    git checkout -b feature-login //創(chuàng)建本地特性分支
    git push -u origin feature-login //推送本地特性分支到遠(yuǎn)程Git倉庫(即創(chuàng)建遠(yuǎn)程特性分支),-u為追蹤遠(yuǎn)程分支
    

    如果遠(yuǎn)程代碼管理平臺支持直接在平臺上創(chuàng)建分支锯梁,則可以直接在平臺上創(chuàng)建遠(yuǎn)程分支陌凳。

    • 最好以功能為單位創(chuàng)建特性分支内舟,而不是以版本號
    • 相對獨立相互沒有關(guān)聯(lián)的功能最好創(chuàng)建不同的特性分支
    • 因為同一個版本的幾個功能在開發(fā)過程中可能會因為需求變更而導(dǎo)致只發(fā)布部分功能验游,這時如果所有功能都在相同分支上,則很難將不同功能的代碼分離出來
    • 特性分支命名為:feature-{name}裸准,BUG修復(fù)的分支則為:hotfix-{name}炒俱,發(fā)布分支為:release-{name},這樣其他人看到這個分支就知道這個分支是什么作用
  5. 如果遠(yuǎn)程Git倉庫中已經(jīng)存在了feature-login特性分支砸王,則直接checkout即可:

    git checkout -b feature-login origin/feature-login
    
  6. 現(xiàn)在你就可以在本地feature-login分支上開發(fā)了谦铃,此時所有的提交都是提交在你的本地feature-login分支上:

    git commit -m "提交說明"
    
  7. 當(dāng)你在本地開發(fā)工作告一段落驹闰,需要把本地代碼推送(Push)到遠(yuǎn)程分支上撒会,而推送之前必須先更新遠(yuǎn)程分支的修改诵肛,因為在你開發(fā)過程中可能有其他人有修改推送到了遠(yuǎn)程feature-login分支上:

    git pull --rebase  //拉取遠(yuǎn)程分支代碼,--rebase最好加上
    

    執(zhí)行完上面命令后褪秀,如果不存在代碼沖突媒吗,則直接把本地修改推送到遠(yuǎn)程倉庫:

    git push //推送到遠(yuǎn)程分支
    

    如果有沖突則在本地merge代碼解決沖突乙埃,然后再推送到遠(yuǎn)程倉庫:

    git commit -m "merge說明"  //將merge的代碼先提交到本地分支
    git push //然后推送到遠(yuǎn)程分支
    
  8. 到現(xiàn)在膊爪,你的所有代碼已經(jīng)提交到遠(yuǎn)程倉庫上米酬,現(xiàn)在需要對新功能進(jìn)行測試,在測試之前需要先把代碼合并到遠(yuǎn)程origin/develop分支上:

    注意:當(dāng)前版本不上線的功能不要合并到遠(yuǎn)程origin/develop分支上加派。

    //以下兩步的作用是保證你本地的feature-login分支的代碼為最新芍锦,因為有可能你是和別人合作開發(fā)的該功能飞盆,如果你剛更新過或者你是一個人在開發(fā)則可以省略此操作
    git checkout feature-login //切換到本地feature-login分支
    git pull --rebase  //拉取最新代碼
    
    git checkout develop //切換到本地develop分支
    git pull --rebase //拉取最新的遠(yuǎn)程origin/develop分支代碼,因為可能已經(jīng)有人提交了代碼
    git merge --no-ff feature-login //從本地feature-login分支合并代碼票腰,--no-ff為禁止fast-farward模式
    git push //推送到遠(yuǎn)程分支
    
    //代碼已經(jīng)合并完女气,可以刪除本地特性分支和遠(yuǎn)程特性分支
    git branch -d feature-login //刪除本地feature-login特性分支
    git branch -r -d origin/feature-login //刪除遠(yuǎn)程origin/feature-login特性分支
    
    • 以上操作炼鞠,如果沒有代碼沖突則直接Push代碼谒主,有沖突就merge代碼后再Push,具體操作可以參考步驟7。

    • 除了直接在develop分支上進(jìn)行代碼的merge和提交姿现,還可以采取Pull Request的方式來合并其他特性分支的代碼。

    • 刪除遠(yuǎn)程特性分支時一定要跟與你一起開發(fā)當(dāng)前功能并且往同一個遠(yuǎn)程分支Push代碼的同學(xué)確認(rèn)他的代碼是否已經(jīng)全部提交和合并肖抱,否則不要隨便刪除遠(yuǎn)程特性分支备典。

  9. 現(xiàn)在,你的代碼已經(jīng)合并到遠(yuǎn)程origin/develop分支上了意述,并且與其他人的代碼進(jìn)行了merge提佣。

  10. 此時就可以基于遠(yuǎn)程origin/develop分支進(jìn)行打包或者部署進(jìn)行測試了,當(dāng)然這個階段的測試只能算是版本開發(fā)中的迭代測試荤崇,因為只有你開發(fā)的功能拌屏,而當(dāng)前版本的其他特性功能還沒有合并到遠(yuǎn)程origin/develop分支上,此時等待其他人把各自功能合并到遠(yuǎn)程origin/develop分支术荤,然后再進(jìn)行所有功能的集成測試。

    其他預(yù)研功能或者下一個版本的功能的代碼都不要合并到origin/develop分支上瓣戚,只在各自的特性分支上開發(fā)即可端圈。

  11. 如果你代碼已經(jīng)提交到遠(yuǎn)程origin/develop分支上,但是發(fā)現(xiàn)提交的代碼有問題需要修改子库,則按照第4步的方法舱权, 重新創(chuàng)建特性分支,比如登錄功能有問題需要修改仑嗅,則重新創(chuàng)建origin/feature-login分支宴倍,重復(fù)第4步-第8步的操作张症。

    當(dāng)然,也有可能你在第8步時沒有刪除遠(yuǎn)程origin/feature-login分支啊楚,所以遠(yuǎn)程特性分子仍然存在吠冤,那是否可以直接在這個分支上開發(fā)呢?

    推薦最好不要恭理,而是重新從遠(yuǎn)程origin/develop分支上拉取新的特性分支拯辙,因為遠(yuǎn)程origin/develop分支上的代碼是merge完之后的最新代碼,而之前的遠(yuǎn)程origin/feature-login分支的代碼并沒有與其他的特性分支進(jìn)行合并颜价,所以有可能你繼續(xù)在之前的遠(yuǎn)程origin/feature-login分支開發(fā)涯保,然后合并到遠(yuǎn)程origin/develop分支時需要再次merge,而每次代碼merge都是有風(fēng)險的周伦。

    當(dāng)然夕春,如果你能確認(rèn)當(dāng)前沒有其他人的特性分支合并到遠(yuǎn)程origin/develop分支上,則可以直接在之前的遠(yuǎn)程origin/feature-login分支上修改問題专挪。

  12. 如果其他人也都完成了新版本的開發(fā)工作及志,而且合并到了遠(yuǎn)程origin/develop分支上,就可以進(jìn)行集成測試了寨腔。這時候從origin/develop分支中拉出一個發(fā)布分支origin/release-1.2.0速侈,然后基于origin/release-1.2.0分支進(jìn)行打包或者部署、集成測試迫卢,方法與第4步相同:

    git checkout develop //切換本地分支到develop分支
    git pull //拉取遠(yuǎn)程Git倉庫中的最新的develop分支的代碼
    git checkout -b release-1.2.0 //創(chuàng)建本地發(fā)布分支
    git push -u origin release-1.2.0 //推送本地發(fā)布分支到遠(yuǎn)程Git倉庫
    
  13. 創(chuàng)建完origin/release-1.2.0分支之后倚搬,下一版本的特性就可以隨時合并到origin/develop分支上了,因為當(dāng)前版本的代碼已經(jīng)都在origin/release-1.2.0分支上乾蛤,在1.2.0版本正式發(fā)布上線之前發(fā)現(xiàn)的所有BUG和功能修改都在origin/release-1.2.0分支上進(jìn)行每界,直到達(dá)到發(fā)布狀態(tài)正式發(fā)布。

  14. 1.2.0版本正式發(fā)布時家卖,需要把origin/release-1.2.0分支分別merge到origin/developorigin/master分支上眨层,方法與步驟8相同,大概步驟如下:

    //合并到遠(yuǎn)程origin/develop分支上
    git checkout develop
    git pull -rebase
    git merge --no-ff release-1.2.0
    git push
    
    //合并到遠(yuǎn)程origin/master分支上
    git checkout master
    git pull -rebase
    git merge --no-ff release-1.2.0
    git push
    git tag -a 1.2.0 -m '版本說明'
    
    //代碼已經(jīng)合并完上荡,可以刪除本地發(fā)布分支和遠(yuǎn)程發(fā)布分支
    git branch -d release-1.2.0 //刪除本地分支
    git branch -r -d origin/release-1.2.0 //刪除遠(yuǎn)程分支
    

    有可能遠(yuǎn)程的develop和master不允許直接merge谐岁,這時可以創(chuàng)建Pull Request進(jìn)行代碼合并。

  15. 新版本正式發(fā)布之后榛臼,如果發(fā)現(xiàn)了嚴(yán)重BUG需要緊急修復(fù)時伊佃,則從origin/master分支中拉出一個本地hotfix分支hotfix-issue30,issue30表示你當(dāng)前修復(fù)的問題ID:

    git checkout master
    git pull -rebase
    git checkout -b hotfix-issue30
    

    修改完BUG之后沛善,必須將當(dāng)前hotfix分支merge到origin/developorigin/master分支上航揉,并打新的tag:

//合并到遠(yuǎn)程origin/develop分支上
git checkout develop
git pull -rebase
git merge --no-ff hotfix-issue30
git push

//合并到遠(yuǎn)程origin/master分支上
git checkout master
git pull -rebase
git merge --no-ff hotfix-issue30
git push
git tag -a 1.2.1-hotfix-issue30 -m '版本修復(fù)說明'

//代碼已經(jīng)合并完,可以刪除本地分支
git branch -d hotfix-issue30 //刪除本地分支    
    
    * 一般hotfix分支可以不用創(chuàng)建遠(yuǎn)程分支金刁,因為某一個BUG一般都是你自己在修改改含,不存在多人協(xié)作,所以只在本地創(chuàng)建hotfix分支即可凰荚。當(dāng)然如果這個問題真是多人一起修改九府,那就需要創(chuàng)建遠(yuǎn)程hotfix分支了是复。
    
    * 如果有幾個BUG之間有關(guān)聯(lián),則可以創(chuàng)建一個hotfix分支進(jìn)行修改,但是如果兩個BUG之間沒有任何關(guān)系,則最好拉取各自的hotfix分支進(jìn)行開發(fā)哼御。
    
    * 也可以直接以版本來創(chuàng)建hotfix分支,比如`hotfix-1.2.1`焊唬,則表示修復(fù)1.2.0版本的BUG恋昼,這個時候可能就需要創(chuàng)建遠(yuǎn)程分支`origin/hotfix-1.2.1`了,因為其他人也要參與這個版本的BUG修復(fù)工作赶促。

16. 到此一個開發(fā)周期完成液肌,重新回到develop分支開始下一個版本的開發(fā)。

UEUEO
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸥滨,一起剝皮案震驚了整個濱河市嗦哆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌婿滓,老刑警劉巖老速,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異空幻,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)容客,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門秕铛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缩挑,你說我怎么就攤上這事但两。” “怎么了供置?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵谨湘,是天一觀的道長。 經(jīng)常有香客問我芥丧,道長紧阔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任续担,我火速辦了婚禮擅耽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘物遇。我一直安慰自己乖仇,他們只是感情好憾儒,可當(dāng)我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著乃沙,像睡著了一般起趾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上警儒,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天训裆,我揣著相機(jī)與錄音,去河邊找鬼冷蚂。 笑死缭保,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蝙茶。 我是一名探鬼主播艺骂,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼隆夯!你這毒婦竟也來了钳恕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蹄衷,失蹤者是張志新(化名)和其女友劉穎忧额,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愧口,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡睦番,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了耍属。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片托嚣。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖厚骗,靈堂內(nèi)的尸體忽然破棺而出示启,到底是詐尸還是另有隱情,我是刑警寧澤领舰,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布夫嗓,位于F島的核電站,受9級特大地震影響冲秽,放射性物質(zhì)發(fā)生泄漏舍咖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一锉桑、第九天 我趴在偏房一處隱蔽的房頂上張望谎仲。 院中可真熱鬧,春花似錦刨仑、人聲如沸郑诺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辙诞。三九已至辙售,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間飞涂,已是汗流浹背旦部。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留较店,地道東北人士八。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像梁呈,于是被迫代替她去往敵國和親婚度。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Git 命令 mkdir testcd testtouch a.md alias 設(shè)置別名 git config ...
    任教主來也閱讀 672評論 0 0
  • 長愿青燈伴官卡,山遙路滿棘蝗茁。 安知魚非樂,難曉雁何棲寻咒。 舊日佳期誤哮翘,今生古韻依。 人言狂傲客毛秘,笑臥海棠居饭寺。
    小薇_閱讀 869評論 29 21
  • 今晚Bigbang天津FM。 我很早就開始準(zhǔn)備叫挟,早早看了場地艰匙,研究了位置圖,該有的應(yīng)援也足了霞揉。之后一切都很順利旬薯,直...
    魚安康閱讀 247評論 0 0
  • 睡夢中 看到你沉默的臉 似哭泣晰骑,在無人的街 那悲傷讓我哽咽 竟有淚從我眼角滑落 夢一場 我睜開濕潤的眼 推開門适秩,看...
    沉默的字閱讀 143評論 0 1