iOS系列開(kāi)發(fā)-版本控制工具Git的使用

iOS系列開(kāi)發(fā)-版本控制工具Git的使用

作為一個(gè)開(kāi)發(fā)者,與團(tuán)隊(duì)之間默契的配合是很重要的,我們所寫(xiě)的代碼在無(wú)論是在公司還是在個(gè)人來(lái)說(shuō)都是一份不可隨意丟棄的東西,但是如果只是單純的開(kāi)發(fā),我們很難做到今天能夠知道上周寫(xiě)完后的項(xiàng)目代碼,我們往往需要備份一份,比如我們今天開(kāi)發(fā)出1.0版本的應(yīng)用,為了留檔,我們可能會(huì)保存一份完整代碼在服務(wù)器,之后再拷貝一份繼續(xù)新的開(kāi)發(fā),但是這樣只能留存部分我們關(guān)注的版本,且一份代碼就是一份文件,我們的項(xiàng)目有個(gè)100M 那么只是單純的10個(gè)備份就有1G了,這樣下去,多大的硬盤(pán)都不夠用.
很萬(wàn)幸,我們擁有版本控制工具.
你可能或多或少的聽(tīng)過(guò)這個(gè),比如GIT 比如SVN
在這里我就簡(jiǎn)單的講講GIT的使用方式

相比同類(lèi)軟件,Git有很多優(yōu)點(diǎn)。其中很顯著的一點(diǎn),就是版本的分支(branch)和合并(merge)十分方便。有些傳統(tǒng)的版本管理軟件,分支操作實(shí)際上會(huì)生成一份現(xiàn)有代碼的物理拷貝,而Git只生成一個(gè)指向當(dāng)前版本(又稱(chēng)"快照")的指針,因此非常快捷易用。

在這里我先使用工具演示一般,之后我會(huì)把對(duì)應(yīng)的終端命令也展示出來(lái),你只需一一對(duì)應(yīng)即可

為了比較容易的做演示,我會(huì)在osChina或者在GitHub上創(chuàng)建一個(gè)新的遠(yuǎn)程項(xiàng)目倉(cāng)庫(kù)來(lái)代替我們所在公司的git服務(wù)器的地址(我們的公司可能會(huì)自己部署服務(wù)器,比如使用gitlab,gerrit等).

1.創(chuàng)建項(xiàng)目遠(yuǎn)程倉(cāng)庫(kù)(如果在公司,公司基本都是已經(jīng)搭建好的,你只要有地址就好了)


這里寫(xiě)圖片描述

這里寫(xiě)圖片描述

這里我們就能看到一個(gè)可以克隆或者下載的倉(cāng)庫(kù)的地址, OK,至此,我們就等于是到公司入職了,公司老大說(shuō)我們創(chuàng)建了一個(gè)新的項(xiàng)目,并且項(xiàng)目的倉(cāng)庫(kù)地址給你了,你只要努力開(kāi)發(fā),把代碼放進(jìn)去就好了.

只有一個(gè)地址!我們改如何做?
這里我就先使用sourcetree這個(gè)工具做直接可視化的演示,后面再自己找終端命令匹配.


這里寫(xiě)圖片描述

選擇從URL克隆輸入我們剛才獲取到的地址,輸入指定到我們本地的目標(biāo)路徑和名稱(chēng)


這里寫(xiě)圖片描述

我們就可以看到我們的桌面出現(xiàn)了一個(gè)文件夾,跟我們創(chuàng)建的倉(cāng)庫(kù)比對(duì)一下
這里寫(xiě)圖片描述

是的這個(gè)文件夾就是倉(cāng)庫(kù)的拷貝!,我們只要在這個(gè)本地倉(cāng)庫(kù)里面寫(xiě)代碼,寫(xiě)完之后推送到遠(yuǎn)程倉(cāng)庫(kù)即可,
OK,我們將我們創(chuàng)建好的一個(gè)iOS(或者任意的)項(xiàng)目直接拖進(jìn)去,或者創(chuàng)建一個(gè)新的項(xiàng)目,項(xiàng)目路徑直接指定到這個(gè)文件夾也可以.
這里我采用創(chuàng)建到指定的該文件夾,項(xiàng)目創(chuàng)建完成之后


這里寫(xiě)圖片描述

我們會(huì)發(fā)現(xiàn)很多的M,A...這里M表示的是修改,A表示的是新增,D表示的是刪除..
我們先不管,我們打開(kāi)sourcetree,會(huì)發(fā)現(xiàn)文件狀態(tài)的變化


這里寫(xiě)圖片描述

選中所有的之后,我們即可提交
這里寫(xiě)圖片描述

我們會(huì)發(fā)現(xiàn)
這里寫(xiě)圖片描述

那么我們點(diǎn)擊推送


這里寫(xiě)圖片描述

你會(huì)發(fā)現(xiàn)新的變化
這里寫(xiě)圖片描述

此時(shí)我們就把我們本地創(chuàng)建好的項(xiàng)目推送到老板給你的服務(wù)器去了!
這樣做有什么好處呢?簡(jiǎn)單點(diǎn),我的電腦壞了,換了一個(gè)電腦我就不需要那U盤(pán)巴拉巴拉的拷貝了,直接還是克隆一份從服務(wù)器即可,我們本地就會(huì)有一個(gè)和遠(yuǎn)程一樣的拷貝了.
如果你是單人開(kāi)發(fā),不會(huì)有任何問(wèn)題了.你每一次提交的版本你都會(huì)有記錄
但是,如果是多人合作開(kāi)發(fā),我們就會(huì)出現(xiàn)我想要推送到遠(yuǎn)程的時(shí)候發(fā)現(xiàn)遠(yuǎn)程的和我們本地的不一樣,在此之前別人也推送了代碼.那么我們只要在提交之后,推送之前先抓取一下就可以了,保證我們的代碼除了本人修改的部分,其余的都和遠(yuǎn)程的一樣即可.
我們也要養(yǎng)成習(xí)慣,在修改代碼前都先抓取一下,這樣隨時(shí)保證我們本地的代碼是最新的.
我們繼續(xù),
我現(xiàn)在扮演的角色是項(xiàng)目組老大,我是負(fù)責(zé)搭建框架的人.
并且我已經(jīng)搭建完成了項(xiàng)目
這里寫(xiě)圖片描述

我把搭建完成之后的項(xiàng)目推送到遠(yuǎn)程
這里寫(xiě)圖片描述

本次提交時(shí)一個(gè)階段性的,我可以打一個(gè)標(biāo)簽,并且推送到遠(yuǎn)程,讓所有人都知道


這里寫(xiě)圖片描述

這里寫(xiě)圖片描述

這樣,我可以根據(jù)標(biāo)簽來(lái)定位某一個(gè)階段性的代碼.

接下來(lái)是工作重點(diǎn)了,master是主分支,是公司的核心主干,我們不可能讓任意的開(kāi)發(fā)人員都在這個(gè)主干上開(kāi)發(fā)代碼并且提交的,作為一個(gè)開(kāi)發(fā)人員我們應(yīng)該在另外一個(gè)主干上開(kāi)發(fā)代碼,等待開(kāi)發(fā)完成之后把代碼在合并到主分支上

很幸運(yùn)的事,我們的git也會(huì)考慮這樣的事情.并且為我們預(yù)備好了,如果我們使用的話(huà).

一、主分支Master


這里寫(xiě)圖片描述

首先,代碼庫(kù)應(yīng)該有一個(gè)、且僅有一個(gè)主分支。所有提供給用戶(hù)使用的正式版本,都在這個(gè)主分支上發(fā)布。
Git主分支的名字,默認(rèn)叫做Master。它是自動(dòng)建立的,版本庫(kù)初始化以后,默認(rèn)就是在主分支在進(jìn)行開(kāi)發(fā)。(很顯然,這樣任何人都在這里干事情,很容易亂掉)

二、開(kāi)發(fā)分支Develop

主分支只用來(lái)分布重大版本,日常開(kāi)發(fā)應(yīng)該在另一條分支上完成。我們把開(kāi)發(fā)用的分支,叫做Develop。


這里寫(xiě)圖片描述

什么意思呢?
我們直接轉(zhuǎn)成可視化的,


這里寫(xiě)圖片描述

這里寫(xiě)圖片描述

我們會(huì)發(fā)現(xiàn),本地多出來(lái)一個(gè)develop的分支,遠(yuǎn)程則沒(méi)有,沒(méi)關(guān)系,我選擇推送
這里寫(xiě)圖片描述

這樣遠(yuǎn)程也就會(huì)多出來(lái)一個(gè)develop了
多出來(lái)一個(gè)分支能干什么呢?


這里寫(xiě)圖片描述

此時(shí)我的角色是公司里面的攻城獅,我修改我要修改的代碼
這里寫(xiě)圖片描述

我們到sourcetree中提交
這里寫(xiě)圖片描述

在推送的時(shí)候我們選擇只推送develop分支到develop分支
這里寫(xiě)圖片描述

這里寫(xiě)圖片描述

經(jīng)過(guò)多次開(kāi)發(fā),終于在develop中的我把1.0完成了
這里寫(xiě)圖片描述

攻城獅跟老大說(shuō),項(xiàng)目開(kāi)發(fā)完成了,于是老大審核過(guò)后,準(zhǔn)備把它放到公司主干上留作備份


這里寫(xiě)圖片描述

這里寫(xiě)圖片描述

我們選擇添加一個(gè)階段性的標(biāo)簽,并且將內(nèi)容推送,
這里寫(xiě)圖片描述

然后我就開(kāi)開(kāi)心心的根據(jù)master的進(jìn)行發(fā)布版本了,
工程師繼續(xù)新的開(kāi)發(fā)在develop,不影響master的內(nèi)容.
當(dāng)時(shí)細(xì)心的你會(huì)發(fā)現(xiàn)合并后的master是這樣的
這里寫(xiě)圖片描述

會(huì)把develop的記錄都合并過(guò)來(lái)
那么怎么能做成這樣的呢?
這里寫(xiě)圖片描述

其實(shí)也很簡(jiǎn)單,你可以在合并的時(shí)候多選擇一個(gè)選項(xiàng)即可
也就是選擇快進(jìn)式合并


這里寫(xiě)圖片描述

這里寫(xiě)圖片描述

你會(huì)看到一個(gè)大的合并到主分支上的效果,這就是我們想要的

那么git就這么簡(jiǎn)單嗎?
并不是.
還記得上面創(chuàng)建develop的時(shí)候多出來(lái)的某些信息嗎?
從初始化的第一個(gè)界面中,還有三類(lèi)分支的命名規(guī)則:feature、release、hotfix,這就是未來(lái)承接具體開(kāi)發(fā)工作的分支類(lèi)型,從名稱(chēng)中就能準(zhǔn)確把握他們的用途。

  • 功能(feature)分支
  • 預(yù)發(fā)布(release)分支
  • 修補(bǔ)bug(fixbug)分支

第一種是功能分支,它是為了開(kāi)發(fā)某種特定功能,從Develop分支上面分出來(lái)的。開(kāi)發(fā)完成后,要再并入Develop。


這里寫(xiě)圖片描述

對(duì)應(yīng)到source中就是


這里寫(xiě)圖片描述

這里寫(xiě)圖片描述

現(xiàn)在就可以在這個(gè)分支上修修補(bǔ)補(bǔ)了,經(jīng)過(guò)一系列艱苦卓越的工作,這個(gè)功能開(kāi)發(fā)完成了,就要合并到develop。功能分支只能合并到develop,因?yàn)檫@些都是臨時(shí)分支,你可以根據(jù)項(xiàng)目需要選擇是否推送到遠(yuǎn)程
這里寫(xiě)圖片描述

這里寫(xiě)圖片描述

提交完成之后,你會(huì)發(fā)現(xiàn)已經(jīng)合并到develop中去了,只要提交到遠(yuǎn)程即可

第二種是預(yù)發(fā)布分支,它是指發(fā)布正式版本之前(即合并到Master分支之前),我們可能需要有一個(gè)預(yù)發(fā)布的版本進(jìn)行測(cè)試。

預(yù)發(fā)布分支是從Develop分支上面分出來(lái)的,預(yù)發(fā)布結(jié)束以后,必須合并進(jìn)Develop和Master分支。它的命名,可以采用release-*的形式。

所有特性的開(kāi)發(fā)工作都是為了產(chǎn)品功能的更替,當(dāng)一個(gè)或多個(gè)特性開(kāi)發(fā)完成,可以進(jìn)行發(fā)布了,就要準(zhǔn)備創(chuàng)建release分支。

Release分支是為上線(xiàn)做準(zhǔn)備的,它的命名也要遵守項(xiàng)目的版本命名規(guī)則,這個(gè)名字在最終合并到master時(shí)會(huì)自動(dòng)變成版本標(biāo)簽。

這里寫(xiě)圖片描述

這里寫(xiě)圖片描述

這個(gè)release分支也是測(cè)試工作的目標(biāo)對(duì)象,,經(jīng)過(guò)一系列艱苦卓越的測(cè)試、調(diào)整工作,這個(gè)release完成了,達(dá)到了可上線(xiàn)的狀態(tài),就要合并到master和develop。


這里寫(xiě)圖片描述

這里寫(xiě)圖片描述

這里寫(xiě)圖片描述

接下來(lái)只要把master推送到遠(yuǎn)程即可了,

最后一種是修補(bǔ)bug分支。軟件正式發(fā)布以后,難免會(huì)出現(xiàn)bug。這時(shí)就需要?jiǎng)?chuàng)建一個(gè)分支,進(jìn)行bug修補(bǔ)。

修補(bǔ)bug分支是從Master分支上面分出來(lái)的。修補(bǔ)結(jié)束以后,再合并進(jìn)Master和Develop分支。它的命名,可以采用fixbug-*的形式。


這里寫(xiě)圖片描述

比如我現(xiàn)在的是2.1版本,然后我在develop中開(kāi)發(fā)2.2版本...
然后發(fā)現(xiàn)2.1版本有一個(gè)bug


這里寫(xiě)圖片描述

這里寫(xiě)圖片描述

經(jīng)過(guò)一系列艱苦卓越的工作,這個(gè)bug修復(fù)完成了,就要合并到master和develop,


這里寫(xiě)圖片描述

這里寫(xiě)圖片描述

偶爾的我們會(huì)發(fā)現(xiàn)合并會(huì)出現(xiàn)沖突,
那么我們就要解決沖突
<<<<<是當(dāng)前分支中的內(nèi)容 >>>>>是其他分支的內(nèi)容

此時(shí)我們能看到我們都需要 那么就把不需要的描述刪除,把需要的保留,修改下那個(gè)文件就好


這里寫(xiě)圖片描述

三類(lèi)臨時(shí)性分支中,hotfix和release的結(jié)果都要合并到master和develop中,為什么?因?yàn)樗鼈兊男薷慕Y(jié)果持續(xù)影響這后續(xù)的開(kāi)發(fā)和維護(hù),必須合并以保證代碼的一致性。

當(dāng)然這個(gè)臨時(shí)性分支的邏輯只是sourcetree給我們提供的一種方式,我們?nèi)绻褂眉兇獾慕K端命令行,我們就需要自己來(lái)掌控這些,

對(duì)應(yīng)的上面的終端命令行
你可以看看
Git常用命令

比如Git創(chuàng)建Develop分支的命令:

git checkout -b develop master

將Develop分支發(fā)布到Master分支的命令:

// 切換到Master分支
git checkout master
// 對(duì)Develop分支進(jìn)行合并
git merge --no-ff develop

這里稍微解釋一下,上一條命令的--no-ff參數(shù)是什么意思。默認(rèn)情況下,Git執(zhí)行"快進(jìn)式合并"(fast-farward merge),會(huì)直接將Master分支指向Develop分支。
使用--no-ff參數(shù)后,會(huì)執(zhí)行正常合并,在Master分支上生成一個(gè)新節(jié)點(diǎn)。為了保證版本演進(jìn)的清晰,我們希望采用這種做法。
....
具體自己可以參考命令行

此外作為iOS開(kāi)發(fā),我們的Xcode也集成了git功能


這里寫(xiě)圖片描述

我們也可以使用這個(gè)工具.配合使用,效果差不多.

最后編輯于
?著作權(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)容

  • 多種多樣的工作流使得在項(xiàng)目中實(shí)施Git時(shí)變得難以選擇。這份教程提供了一個(gè)出發(fā)點(diǎn),調(diào)查企業(yè)團(tuán)隊(duì)最常見(jiàn)的Git工作流。...
    JSErik閱讀 4,609評(píng)論 2 8
  • 一到上班時(shí)間,崩潰。
    漂浮的云彩閱讀 97評(píng)論 0 0
  • 訂閱的那天覺(jué)得1000字沒(méi)什么,其實(shí)腦子里是沒(méi)有概念的。很顯然,最近幾天并沒(méi)有寫(xiě),更不用提堅(jiān)持寫(xiě)。就像現(xiàn)在生活的...
    內(nèi)匠閱讀 251評(píng)論 0 0
  • 新的一年又開(kāi)始了,你也許有y著一些不甘與不愿,又或許有著諸多期待與希冀,無(wú)論怎樣,卻都得收拾行囊,離別上路。以怎...
    大概好久閱讀 235評(píng)論 0 0
  • 先做你應(yīng)做的事,才能做你想做的事
    93650345d0d1閱讀 153評(píng)論 0 0

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