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ā)流程
-
首先將代碼下載到本地酌壕,如果本地已經(jīng)有代碼則直接進(jìn)入下一步:
git clone https://github.com/lijinzhe/gittest.git
-
查看所有分支,這時最少會看到3個分支果港,一個本地分支
master
分支京腥,和兩個遠(yuǎn)程分支origin/master
和origin/develop
分支:git granch -a
顯示結(jié)果如下:
* master ... //更多本地分支 remotes/origin/HEAD -> origin/master remotes/origin/master remotes/origin/develop ... //更多遠(yuǎn)程分支
-
確認(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)程分支
-
現(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},這樣其他人看到這個分支就知道這個分支是什么作用
-
如果遠(yuǎn)程Git倉庫中已經(jīng)存在了
feature-login
特性分支砸王,則直接checkout即可:git checkout -b feature-login origin/feature-login
-
現(xiàn)在你就可以在本地
feature-login
分支上開發(fā)了谦铃,此時所有的提交都是提交在你的本地feature-login
分支上:git commit -m "提交說明"
-
當(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)程分支
-
到現(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)程特性分支备典。
現(xiàn)在,你的代碼已經(jīng)合并到遠(yuǎn)程
origin/develop
分支上了意述,并且與其他人的代碼進(jìn)行了merge提佣。-
此時就可以基于遠(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ā)即可端圈。 -
如果你代碼已經(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
分支上修改問題专挪。 -
如果其他人也都完成了新版本的開發(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倉庫
創(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ā)布。-
1.2.0版本正式發(fā)布時家卖,需要把
origin/release-1.2.0
分支分別merge到origin/develop
和origin/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)行代碼合并。
-
新版本正式發(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/develop
和origin/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