在Xcode中使用Git進(jìn)行源碼版本控制

學(xué)習(xí)如何在Xcode中使用git涛舍,以及Xcode是如何整合Git的各項(xiàng)功能。如果你覺得對這些很陌生唆途,我建議你先上網(wǎng)搜索一下相關(guān)的內(nèi)容。在接下來的教程中,我會(huì)假定你已經(jīng)了解了版本控制系統(tǒng)和git是什么街望,并將注意力集中在Xcode如何管理它上剩拢。

GIT Demo概述(GIT Demo Overview)

與其他教程中的demo app不同,這次我們不會(huì)去實(shí)現(xiàn)一個(gè)應(yīng)用來演示某一項(xiàng)iOS SDK特性渊额,最終我們也不會(huì)產(chǎn)生一個(gè)示例產(chǎn)品。實(shí)際上,我們會(huì)新建一個(gè)demo工程鬼癣,寫幾行代碼,然后利用這個(gè)工程來演示Xcode提供的版本管理功能啤贩。換句話說待秃,我們會(huì)集中注意里于IDE上,而不是iOS本身痹屹。

我建議你跟著我一起一步一步實(shí)現(xiàn)這個(gè)實(shí)例項(xiàng)目章郁,在相應(yīng)的地方手動(dòng)添加代碼,不用擔(dān)心志衍,代碼量不是很多暖庄。跟著教程的步驟,我們將執(zhí)行多種重復(fù)的版本控制相關(guān)的操作楼肪,并且我們必須實(shí)時(shí)看到結(jié)果培廓。如果我只是提供了一個(gè)具備所有操作的的應(yīng)用,那么你無法體會(huì)到這些改變淹辞。

好了医舆,廢話不多說了,讓我們仔細(xì)看看使用Xcode進(jìn)行版本控制的要點(diǎn)吧象缀。

創(chuàng)建一個(gè)Git源(Creating a Git repository)

每次在Xcode中創(chuàng)建新工程的時(shí)候蔬将,都會(huì)提示開發(fā)者是否將項(xiàng)目作為一個(gè)本地的git源。在創(chuàng)建工程的最后一步Xcode會(huì)有一個(gè)復(fù)選框央星,如果選擇了它霞怀,git源就會(huì)被添加到工程目錄中。通常這個(gè)選項(xiàng)會(huì)被忽視莉给,或是被認(rèn)為是Xcode的另外一個(gè)沒用的功能毙石,尤其是從未用過git的開發(fā)者,或是編程新手颓遏。

打開Xcode徐矩,創(chuàng)建一個(gè)新的工程。選擇iOS區(qū)的“Application”叁幢,在應(yīng)用模板頁選擇“Single View Application”滤灯。

選擇下一步,在項(xiàng)目名中輸入GitDemo,確保下面的Devices菜單選擇iPhone鳞骤,無需iPad或者universal app窒百。

點(diǎn)擊下一步,也就是最后一個(gè)步驟豫尽,在這里先選擇一個(gè)要保持工程的目錄篙梢,然后在窗口底部選上Create git repository on (My Mac ):

默認(rèn)情況下,這個(gè)選項(xiàng)是被選上的美旧,如果你不想使用git渤滞,你可以取消它,但是我不建議這么做陈症。本教程中蔼水,你需要將它勾選上,然后點(diǎn)擊創(chuàng)建按鈕录肯。

創(chuàng)建完項(xiàng)目之后趴腋,打開Finder,找到項(xiàng)目存儲(chǔ)的目錄论咏,在目錄中优炬,有一個(gè).git的子目錄,時(shí)Xcode為存儲(chǔ)git源相關(guān)數(shù)據(jù)自動(dòng)創(chuàng)建的厅贪。

如果你看不到.git目錄蠢护,你需要讓隱藏的文件可見。具體做法就是打開一個(gè)Terminal窗口养涮,輸入以下命令:

對于OS X Mavericks 10.9:

defaults write com.apple.finder AppleShowAllFiles TRUE

對于以前的OS X版本葵硕,

efaults write com.apple.Finder AppleShowAllFiles TRUE

為了重啟Finder應(yīng)用,輸入

killall Finder

這就是本項(xiàng)目在本地git源保存的位置贯吓。實(shí)際上懈凹,如果你選上了相應(yīng)的選項(xiàng),這個(gè)目錄就會(huì)被創(chuàng)建悄谐。相應(yīng)地介评,在你創(chuàng)建新應(yīng)用時(shí),.git子目錄也會(huì)一同被創(chuàng)建爬舰。

顯然使用Xcode創(chuàng)建一個(gè)git源毫不費(fèi)力们陆,然而,如果你在項(xiàng)目創(chuàng)建時(shí)未創(chuàng)建git源情屹,之后又想加上這個(gè)功能怎么辦呢坪仇?好吧,其實(shí)你可以在任何時(shí)候?yàn)槟愕捻?xiàng)目創(chuàng)建源垃你,但是不是使用Xcode椅文。盡管這種情況很少發(fā)生颈墅,我還是會(huì)告訴你該怎么做。

如果你愿意的話雾袱,你可以直接跳到本教程的下一部分。我建議你接著讀下去官还,因?yàn)榻酉聛磉@些信息還是很有用的芹橡。

在進(jìn)行演示前,你需要首先通過Xcode下載Command Line Tools望伦,因?yàn)槲覀円赥erminal下操作林说,并且需要一些額外的工具。如果你還沒有下載屯伞,那就去Xcode>Preferences…菜單腿箩,選擇Download選項(xiàng)卡,展開Components區(qū)劣摇,點(diǎn)擊Commond Line Tools右邊下載按鈕珠移。下載完成后,一個(gè)對勾符號會(huì)取代下載按鈕末融。

現(xiàn)在钧惧,為這個(gè)例子再創(chuàng)建一個(gè)工程,完事后可以刪了它勾习。在創(chuàng)建時(shí)取消那個(gè)創(chuàng)建git源的選項(xiàng)浓瞪。這次我們不想讓Xcode為我們準(zhǔn)備一個(gè)源。把這個(gè)工程命名為NoGitExample巧婶,保存到桌面乾颁,然后你可以跟我接下來輸入的命令一樣。

一切準(zhǔn)備妥當(dāng)后艺栈,打開Terminal窗口(如果你之前打開了一個(gè)英岭,那就先關(guān)掉它再重啟,從而使我們安裝的命令行工具生效)眼滤。下面切換到新項(xiàng)目的目錄:

cd /Users/YOUR-USERNAME/Desktop/NoGitExample

別忘了在上邊命令中設(shè)置Mac的用戶名巴席,接下來,輸入:

git init

這會(huì)初始化一個(gè)空的源诅需,如果你在Finder里面查看或是輸入ls命令漾唉,你會(huì)看到.git子目錄已經(jīng)被創(chuàng)建,很好堰塌,接下來輸入:

git add .

這樣赵刑,當(dāng)前目錄所有的內(nèi)容就被添加到源里面去了,最后场刑,輸入以下命令:

git commit -m 'Initial commit'

接下來會(huì)出現(xiàn)一個(gè)本地git源所執(zhí)行的改變列表般此,如下圖所示:

現(xiàn)在git源就建好了蚪战,但是如果你回到Xcode,打開Source Control菜單铐懊,你會(huì)發(fā)現(xiàn)一切仍然是被禁用邀桑。

這是因?yàn)楫?dāng)我們使用命令行工具創(chuàng)建git源時(shí),Xcode并未被通知科乎,下面點(diǎn)擊Xcode>Quit Xcode壁畸,然后重新啟動(dòng)它,在NoGitExample項(xiàng)目中茅茂,如果你再次打開Source Control菜單捏萍,你會(huì)發(fā)現(xiàn)所有的選項(xiàng)已經(jīng)被使能了,就像一開始勾選上創(chuàng)建git源一樣空闲。

現(xiàn)在這個(gè)項(xiàng)目的使命已經(jīng)結(jié)束令杈,你可以在桌面上刪除它。

現(xiàn)在你知道如何為你所有的項(xiàng)目添加git源了碴倾,即使你在創(chuàng)建時(shí)沒有添加逗噩,你也可以在以后任何時(shí)候?yàn)樗謩?dòng)添加源。

提交更改(Committing Changes)

提交更改指的是儲(chǔ)存一個(gè)包含所有更改的新版本影斑。一般來說给赞,當(dāng)我們做了一些有意義的工作,并且項(xiàng)目處于某一個(gè)穩(wěn)定狀態(tài)時(shí)矫户,就可以提交一次更改片迅。然而具體什么時(shí)候提交更改并沒有硬性的規(guī)定。我的建議是:從上次提交更改之后皆辽,如果你怕花費(fèi)大量時(shí)間和精力做的新工作被誤刪很難恢復(fù)柑蛇,你就需要提交更改了。

默認(rèn)情況下驱闷,Xcode在項(xiàng)目創(chuàng)建之初會(huì)提交一次更改耻台,這是為了保存項(xiàng)目初始狀態(tài)。這項(xiàng)工作會(huì)在后臺完成空另,不會(huì)打擾你或者要求你進(jìn)行確認(rèn)盆耽。如果你在項(xiàng)目創(chuàng)建時(shí)沒有添加git源,但是之后你手動(dòng)添加了扼菠,你可以通過我們先前使用過的命令來進(jìn)行提交:git commit -m ‘Initial commit’

實(shí)際上摄杂,你如果去Source Control>History…菜單,你就會(huì)看到初次提交更改的記錄循榆,以后每次提交更改析恢,都會(huì)在這里有所記錄。

接下來讓我們小幅修改一下我們的工程秧饮,在ViewController.m文件中映挂,添加以下屬性聲明:

@interface ViewController ()

@property (nonatomic) int sum;

@end

接下來泽篮,像下面這樣修改viewDidLoad方法:

-?(void)didReceiveMemoryWarning

{

[superdidReceiveMemoryWarning];

//?Dispose?of?any?resources?that?can?be?recreated.

int?a?=?5;

int?b?=?10;

self.sum?=?a?+?b;

NSLog("The?result?is:?%d",?self.sum);

}

看一下Project navigator面板,你會(huì)發(fā)現(xiàn)在ViewController.m文件旁邊柑船,添加了一個(gè)M字母帽撑,像下面這樣:

這意味著那個(gè)文件已經(jīng)被修改,相比上一次提交更改鞍时,文件有所改變油狂。一般來說,你每次改變文件寸癌,都會(huì)出現(xiàn)這個(gè)M字母,提醒你有未提交的更改弱贼。

下面看看如何提交更改蒸苇,其實(shí)非常簡單,只需要打開Source Control>Commit菜單吮旅,下面窗口就會(huì)出現(xiàn):

讓我們一步步看看它告訴我們了什么溪烤。在左邊(標(biāo)1的區(qū)域),列出了所有被更改的文件庇勃,在這個(gè)例子中檬嘀,只有ViewController.m這個(gè)文件被改變,因此列表中只有它被顯示责嚷。如果你仔細(xì)觀察鸳兽,你會(huì)發(fā)現(xiàn)文件左邊有一個(gè)選擇框,默認(rèn)情況下是被選中的罕拂,如果你取消它揍异,這個(gè)文件的更改就不會(huì)被提交。

在窗口的中間區(qū)域爆班,有兩個(gè)預(yù)覽窗口衷掷,左邊那個(gè)是文件當(dāng)前版本,右邊是文件上一次提交更改的版本柿菩。因?yàn)槲覀兡壳爸皇莿?chuàng)建時(shí)提交過一次更改戚嗅,因此右邊顯示的是文件的初始狀態(tài)。

左邊窗口藍(lán)色區(qū)域標(biāo)出的就是更改的內(nèi)容枢舶,這樣的表示讓我們可以清楚地看出所有的修改懦胞。如果你仔細(xì)看,會(huì)發(fā)現(xiàn)在兩個(gè)窗口之間還有一個(gè)帶數(shù)字的小標(biāo)簽祟辟,這個(gè)數(shù)字一一表示了各項(xiàng)更改医瘫。在數(shù)字旁邊,默認(rèn)情況下有一個(gè)小對勾旧困,表示本更改會(huì)被提交醇份,如果你點(diǎn)擊右邊的小箭頭稼锅,會(huì)彈出一個(gè)選項(xiàng)菜單,你可以選擇不提交這個(gè)更改或是忽略它僚纷。

如果你選擇了Don’t Commit這個(gè)選項(xiàng)矩距,小對勾就會(huì)被一個(gè)停止標(biāo)志取代,這項(xiàng)更改就不會(huì)被保存到源中怖竭。

如果你選擇了Discard Change這個(gè)選項(xiàng)锥债,會(huì)彈出一個(gè)確認(rèn)窗口,提示你所做的更改會(huì)被恢復(fù)痊臭,并且無法取消這個(gè)操作哮肚。

如果你點(diǎn)擊了OK按鈕,所選區(qū)域的改變就會(huì)消失广匙,就像他們從未出現(xiàn)過一樣允趟。

如果你仔細(xì)觀察上面這個(gè)提交窗口,你會(huì)看到你所做的所有修改都會(huì)被Xcode看做改變鸦致,即使是一個(gè)空行潮剪。實(shí)際上空行相當(dāng)于回車,在屏幕上是不可見的分唾,因此作為改變也是理所當(dāng)然的抗碰。

在本例子中,你不用忽略任何修改绽乔,而是允許提交所有更改弧蝇,因此所有的改變標(biāo)簽旁邊必須都是小對勾折砸。

在兩個(gè)窗口下面是一個(gè)空白的區(qū)域鞍爱,中間顯示了提交更改的信息盗扇。這個(gè)地方可以添加一些關(guān)于此次更改的簡短描述疗隶,點(diǎn)擊它,加入如下內(nèi)容:

書寫有意義的提交信息非常有用坚弱,尤其是當(dāng)你頻繁提交的時(shí)候碾阁。因此脂凶,把它當(dāng)做一個(gè)必要的步驟。

現(xiàn)在這個(gè)窗口的基本信息看的差不多了冠桃,是時(shí)候做我們第一次的提交了胸蛛。在這個(gè)窗口的右下腳泞当,有一個(gè)按鈕上面寫著:Commit 1 file襟士。

這個(gè)按鈕會(huì)顯示需要提交的文件總數(shù)蝶溶。點(diǎn)擊它之后你的第一次提交就完成了梨州!打開Source control > History,你會(huì)發(fā)現(xiàn)它會(huì)被顯示在列表中每窖。

從上圖中可以看出旭寿,我們編寫的信息以及更改的文件數(shù)量會(huì)被顯示出來盅称。Xcode執(zhí)行初始提交,所有文件都會(huì)被提交一下疾层,而這次只有我們修改的那個(gè)文件被提交痛黎。

另外,關(guān)閉歷史窗口井厌,看一下Project Navigator,你會(huì)發(fā)現(xiàn)ViewController.m旁邊的M符號已經(jīng)消失了墓拜。

現(xiàn)在,讓我們準(zhǔn)備下一次提交贿衍。這次,我們給工程添加一些新的文件奢啥。添加文件最好的方式就是創(chuàng)建個(gè)新類,因此赌结,按下Command+N組合鍵,添加一個(gè)Objective-C類量承。讓這個(gè)類繼承NSObject類,取名叫TestClass忧风,然后添加到工程中。

完成之后弟蚀,注意一下Project Navigator,你會(huì)發(fā)現(xiàn)兩個(gè)新的類文件旁邊有個(gè)A的字母標(biāo)識规肴,這意味著這些文件已經(jīng)被添加到項(xiàng)目中捶闸,當(dāng)然,他們還沒有被提交拖刃。

打開ViewController.h文件删壮,導(dǎo)入我們的新類:

#import "TestClass.h"

下一步,打開ViewController.m文件兑牡,像下面一樣聲明一個(gè)私有屬性:

@interface ViewController ()

@property (nonatomic) int sum;

@property (nonatomic, strong) TestClass *testClass;

@end

看一下項(xiàng)目導(dǎo)航欄央碟,這次有四個(gè)文件有待提交。讓我們打開Source Control > Commit菜單收毫,將它們提交。

需要提交的一共有5個(gè)文件别凹。除了之前修改的四個(gè)之外薪介,還有一個(gè)項(xiàng)目配置文件。Xcode會(huì)在新類被添加到項(xiàng)目中之后自動(dòng)修改這個(gè)文件怀跛。如果你你打開TestClass.h或TestClass.m文件,左邊的窗口沒有任何顯示低千,如下圖所示。

這是因?yàn)樵谶@個(gè)文件在之前沒有被提交的記錄,因此沒有一個(gè)可以比較的版本岖是,在右邊只顯示了File was added灯抛。

在消息區(qū)寫上這樣一個(gè)描述:TestClass was added to project.. 之后點(diǎn)擊Commit 5 files按鈕即可已脓。

這樣第二次手動(dòng)提交就成功了邓了。你可以到Source Control > History 菜單查看提交的記錄骗炉。

版本之間的比較(Comparing Versions)

當(dāng)你提交了同一工程的不同版本之后照宝,在他們之間比較轻专,追蹤修改信息就會(huì)非常方便。當(dāng)新添加的代碼不能運(yùn)行時(shí)苟穆,這時(shí)與之間版本進(jìn)行比較就非常重要了抄课,你可以看出新版本相比上個(gè)穩(wěn)定版有了哪些更改。

要比較同一個(gè)文件的兩個(gè)版本雳旅,你可以使用View>Version Editor>Show version editor跟磨,或是點(diǎn)擊工具欄上的Version Editor按鈕:

點(diǎn)擊之后,編輯器會(huì)分為兩欄攒盈。最初抵拘,兩欄會(huì)顯示相同的內(nèi)容,點(diǎn)擊編輯器下面的那個(gè)小時(shí)鐘圖標(biāo)型豁,可以選擇之前已經(jīng)提交的版本進(jìn)行比較僵蛛。

點(diǎn)擊之后,兩個(gè)版本的區(qū)別會(huì)在編輯器中顯示出來迎变。通常充尉,左邊顯示的是當(dāng)前版本的文件,右邊顯示的是之前的版本衣形。藍(lán)色高亮的區(qū)域顯示了被更改的代碼驼侠,因此比較代碼的變化非常容易。繼續(xù)選擇任何此前的版本谆吴,并觀察兩欄的區(qū)別倒源。

你可能會(huì)注意到,在兩個(gè)編輯器中間纪铺,還有在提交窗口看到的小標(biāo)簽相速。點(diǎn)擊向下的按鈕可以跳出讓你忽略更改的選項(xiàng)碟渺。如果你點(diǎn)擊了忽略更改鲜锚,Xcode會(huì)提示你是否同意突诬。如果你同意忽略,這些被忽略的代碼將會(huì)永遠(yuǎn)消失芜繁,無法再找回來旺隙。所以要注意不要無意中忽略任何代碼。

除了上面說到的方法骏令,還有一種你回到之前版本的方法蔬捷。如果你仔細(xì)觀察兩個(gè)編輯器下面的工具欄,在中間有個(gè)帶箭頭的時(shí)鐘圖標(biāo):

點(diǎn)擊它之后榔袋,兩個(gè)面板之間的縱列內(nèi)容就發(fā)生了改變周拐,變成了一系列表示之前更改的時(shí)間戳。注意并不是所有的都代表實(shí)際提交凰兑。代表先前版本的圓角矩形的數(shù)量取決于提交的次數(shù)妥粟。在這個(gè)例子中,只有兩個(gè)這樣的圖形吏够,代表了兩次提交勾给。

在這一列的下面,有兩個(gè)箭頭锅知。左邊的那個(gè)屬于左邊的面板播急,右邊的箭頭屬于右邊的面板。將箭頭移動(dòng)到任意之前的版本售睹,你會(huì)看到在相應(yīng)面板中的改變桩警。如果你想比較當(dāng)前版本和之前任意版本的區(qū)別,讓一個(gè)箭頭指向local行昌妹,然后移動(dòng)第二個(gè)箭頭生真。時(shí)間戳從底部到頂部代表了從新到舊的代碼。在base行捺宗,你會(huì)看到上一次提交的內(nèi)容柱蟀。繼續(xù)向上移動(dòng),你會(huì)看到最初的提交蚜厉,如下圖所示:

現(xiàn)在你知道如何比較版本之間的區(qū)別了长已。再繼續(xù)深入之前,把前面學(xué)習(xí)的練習(xí)一下玩玩吧昼牛。

究竟是誰的錯(cuò)术瓮?(Who’s Got the Blame)

除了比較文件的版本外,Xcode還可以讓你追蹤文件的提交者贰健,以及是誰改變了哪一部分代碼胞四。在一個(gè)多人的團(tuán)隊(duì)中,這非常有用伶椿。要使用這個(gè)功能辜伟,點(diǎn)擊View > Version Editor > Show Blame View菜單氓侧。或是講鼠標(biāo)放在工具欄的Version editor 按鈕上导狡,選擇Blame選項(xiàng)约巷。一個(gè)與上面類似的窗口將會(huì)出現(xiàn):

正如你看到的,當(dāng)前文件依據(jù)不同的提交被水平線分成幾段旱捧,每個(gè)代碼段的作者独郎,以及提交信息和其他信息顯示在窗口右邊的一個(gè)特殊面板中。

如果你還沒有做過枚赡,那自己動(dòng)手打開這個(gè)blame視圖氓癌,注意一下Xcode展現(xiàn)代碼段作者的方式。在這個(gè)視圖中贫橙,可以方便地找到某一代碼在何時(shí)被誰提交以及其他你想要的信息顽铸。將鼠標(biāo)放在blame面板上,將會(huì)顯示修改的一些其他信息料皇。當(dāng)指針停在提交段上時(shí)谓松,一個(gè)帶圖片的小按鈕就會(huì)出現(xiàn)在它的右邊。點(diǎn)擊選中該段代碼践剂,就會(huì)彈出一個(gè)附帶提交信息窗口鬼譬。在這個(gè)窗口中,你還可以跳轉(zhuǎn)到比較窗口(indication #1)逊脯,以及特定提交的修改文件(indication #2)优质。

除了比較視圖和blame試圖,其實(shí)還有一個(gè)日志視圖(Log view)军洼。你可以通過View > Version Editor > Show Log View來打開它巩螃。或者如果你在這里就不在詳細(xì)說它了匕争。你可以自己去看看避乏,畢竟這個(gè)用起來也沒那么復(fù)雜。

分支(Branches)

試想一下甘桑,你現(xiàn)在的工程有一個(gè)即將發(fā)布的版本拍皮,或是已經(jīng)發(fā)布的版本,你突然想添加一些新的特性跑杭,如何防止這些新添加的代碼讓整個(gè)項(xiàng)目陷入癱瘓呢铆帽?答案很簡單:你需要使用分支。

如何簡單的理解分支呢德谅?你可以把你的項(xiàng)目想象成一棵樹爹橱,穩(wěn)定版本就是樹的主干。任何添加新功能的版本都必須是樹干的一部分窄做。分支愧驱,就像是樹的枝干慰技,它從樹干生長出來,向不同的方向生長冯键。在git中,你可以通過創(chuàng)建分支來為你的代碼設(shè)置一個(gè)新的路徑來實(shí)現(xiàn)新特性庸汗,而不用擔(dān)心在開發(fā)中破壞主干惫确。

實(shí)際上,在git中默認(rèn)都會(huì)有一個(gè)分支蚯舱,叫做master改化。Xcode自動(dòng)執(zhí)行的第一次提交中就發(fā)生在這個(gè)分支中。通常枉昏,單獨(dú)的開發(fā)者只在master這個(gè)分支開發(fā)陈肛,這其實(shí)不是一個(gè)好習(xí)慣。無論你是單打獨(dú)斗還是組團(tuán)合作兄裂,我認(rèn)為在對項(xiàng)目作出重大改變或添加重大功能時(shí)句旱,使用分支是十分重要的,它會(huì)為你避免很多麻煩晰奖。當(dāng)然谈撒,在團(tuán)隊(duì)項(xiàng)目中,為你自己負(fù)責(zé)部分的代碼搞一個(gè)分支幾乎是必須的匾南。

關(guān)于分支啃匿,你必須記住以下兩點(diǎn):

提交到App Store或客戶的最終產(chǎn)品必須是項(xiàng)目中的master分支項(xiàng)目。

任何在第二分支中實(shí)現(xiàn)的代碼或者功能最終都必須合并到master分支蛆楞,這樣正式發(fā)布的應(yīng)用程序才是完整的溯乒。(以后再講這一點(diǎn))

當(dāng)你開始一個(gè)新分支時(shí),你實(shí)際上是以當(dāng)前工作狀態(tài)作為起點(diǎn)豹爹,即使你有任何未提交的更改裆悄。從這個(gè)時(shí)候起,所有的改變都會(huì)只體現(xiàn)在分支中臂聋。

現(xiàn)在讓我們回到Xcode灯帮,要?jiǎng)?chuàng)建一個(gè)分支,點(diǎn)擊Source Control > GitDemo-master > New Brance…這個(gè)菜單逻住,然后會(huì)彈出如下菜單:

為這個(gè)分支起一個(gè)名字钟哥,我就把它起名為AnotherBranch好了。現(xiàn)在你怎么給它起名其實(shí)都無所謂瞎访。點(diǎn)擊OK按鈕腻贰,等一下新的分支就會(huì)被創(chuàng)建,而當(dāng)前的代碼也會(huì)復(fù)制到新分支中去扒秸。

打開Source Control菜單,你就可以輕松地找出活動(dòng)分支是哪一個(gè):它就在項(xiàng)目名字的旁邊门坷。

現(xiàn)在调鲸,讓我們做一次新的分支的提交。在這之前翼闽,讓我們添加一些新的代碼。打開類文件洲炊,在私有屬性區(qū)添加以下方法聲明:

@interface ViewController ()

-(void)sayHello;

@end

然后實(shí)現(xiàn)它:

1

2

3-(void)sayHello{

NSLog("Hello");

}

最后感局,在viewDidLoad中調(diào)用它:

-?(void)didReceiveMemoryWarning

{

[self?sayHello];

}

現(xiàn)在,點(diǎn)擊Source Control > Commit菜單暂衡,版本比較窗口將會(huì)出現(xiàn)询微,你會(huì)看到只有一個(gè)被修改過的文件--ViewController.m文件,新添加的部分會(huì)被高亮顯示狂巢。

輸入下一個(gè)提交信息:First commit to a new branch撑毛,然后點(diǎn)擊commit 1 file按鈕。現(xiàn)在AnotherBrance分支的改變就會(huì)被提交了唧领。

打開Version Editor(menu View > Version Editor > Show Version Editor)藻雌,找到右邊編輯面板下面的工具欄,你會(huì)看到被選中的分支是AnotherBranch斩个,點(diǎn)擊它蹦疑,你會(huì)看到這個(gè)分支和master分支同時(shí)出現(xiàn),從master分支中選擇任意版本萨驶,Xcode都會(huì)高亮顯示兩者之間的區(qū)別歉摧。通過這樣,你可以方便地跟蹤所有分支間代碼的改變腔呜。

最后叁温,切換到另一個(gè)分支,或是master分支核畴,你可以點(diǎn)擊Source Control > GitDemo –AnotherBranch > Switch to Branch…菜單膝但。

從這個(gè)窗口你可以選擇想要跳轉(zhuǎn)的分支,在這里讓我們跳回master分支:

選擇它并點(diǎn)擊Switch按鈕谤草,master分支就會(huì)成為當(dāng)然活動(dòng)分支跟束。你會(huì)發(fā)現(xiàn)在AnotherBranch中做出的改變并沒有出現(xiàn)在master分支。很好丑孩,我們在管理工程推進(jìn)的同時(shí)冀宴,卻沒有修改穩(wěn)定版本。

合并分支(Merging Branches)

在分支中進(jìn)行開發(fā)是一種好習(xí)慣温学,然而略贮,如果代碼改變要體現(xiàn)在發(fā)行版中,那么分支就必須被合并到master分支中。這一節(jié)我們將會(huì)告訴你怎樣合并它們逃延。在Xcode里览妖,將兩個(gè)分支合并成一個(gè)非常簡單。

讓我們做一個(gè)小實(shí)驗(yàn)來看看合并是怎樣工作的揽祥。首先讽膏,確保master分支是現(xiàn)在的活動(dòng)分支。如果不是拄丰,趕緊改過來:Source Control > GitDemo – AnotherBranch > Switch To Branch… menu府树,并從展示窗口選擇master分支。

下一步愈案,創(chuàng)建一個(gè)新的分支:Source Control > GitDemo – master > New Branch… menu挺尾,命名為LastBranch

先讓Xcode飛一會(huì)鹅搪,然后站绪,到ViewController.m文件中,再創(chuàng)建一個(gè)私有方法丽柿,首先聲明它:

@interface ViewController ()

-(void)sayByeBye;

@end

然后實(shí)現(xiàn)它:

-(void)sayByeBye{

NSLog("Bye?-?Bye");

}

最后恢准,在ViewDidLoad方法中調(diào)用它:

-?(void)viewDidLoad

{

...

[self?sayByeBye];

}

在合并之前,先提交這些更改甫题。使用Source Control > Commit菜單來執(zhí)行提交馁筐。

終于還是來到這一步,關(guān)于把兩個(gè)不同的分支合并成一個(gè)坠非,你有兩種選擇:

從分支合并:與你選擇的分支相關(guān)的任何改變都會(huì)被合并到現(xiàn)在活動(dòng)分支中敏沉。

合并到分支:當(dāng)前活動(dòng)分支的任何改變都會(huì)被合并到你選擇的分支中。

這兩種方式你都可以在Source Control > GitDemo 菜單中找到炎码。注意當(dāng)你的活動(dòng)分支是master分支時(shí)盟迟,第二個(gè)選項(xiàng)是不可選的。

假設(shè)一個(gè)開發(fā)者在Anotherbranch分支實(shí)現(xiàn)一個(gè)sayHello方法潦闲,另外一個(gè)開發(fā)者在LastBranch中創(chuàng)建實(shí)現(xiàn)了sayByeBye方法攒菠,現(xiàn)在你需要將兩個(gè)人的工作合并到下一個(gè)穩(wěn)定版本中,想一想你需要怎么做歉闰?很簡單辖众,按以下方法將改變從兩個(gè)分支中合并進(jìn)來:

首先,確保當(dāng)前活躍分支是master分支和敬。

然后凹炸,打開Source Control > GitDemo – master > Merge From Branch…菜單,選擇AnotherBranch然后點(diǎn)擊Merge按鈕昼弟。

接下來會(huì)出現(xiàn)一個(gè)比較窗口还惠,在里面你會(huì)看到合并之后代碼的更改,看一眼,感覺差不多了就再點(diǎn)擊Merge按鈕蚕键。

Xcode會(huì)詢問你是否保存項(xiàng)目的快照救欧,點(diǎn)擊Enable按鈕。讓Xcode飛一會(huì)锣光,然后就好啦笆怠。AnotherBranch里面添加的內(nèi)容已經(jīng)合并到master分支中。

使用同樣的方法來合并LastBranch誊爹。你會(huì)發(fā)現(xiàn)如果你不提交更改蹬刷,Xcode不會(huì)讓你再次合并。于是频丘,我們只好先提交一下办成。在比較窗口你會(huì)發(fā)現(xiàn)一個(gè)紅色的區(qū)域顯示合并之后的更改,而不是之前的藍(lán)色搂漠。這意味著分支中的代碼將會(huì)替換原先活動(dòng)分支中的代碼迂卢。

你可以輕松地避免這種現(xiàn)象的發(fā)生。在編輯面板的下面有幾個(gè)小按鈕桐汤,你可以試試他們都有什么作用而克,我選了第一個(gè),它的意思是master分支的代碼會(huì)被放在上面怔毛,另一個(gè)分支的代碼會(huì)跟在它后面员萍。

處理接下來所有需要更改的代碼,不要有遺漏拣度。完事后就點(diǎn)擊Merge按鈕碎绎。

恭喜你!你已經(jīng)成功的學(xué)會(huì)從多個(gè)分支合并了代碼抗果,類似的情形你也應(yīng)該會(huì)了筋帖。

忽略更改(Discarding Changes)

放棄不想要的代碼更改功能非常有用,只需輕輕一點(diǎn)窖张,自從上一次提交之后的更改都會(huì)被放棄幕随。當(dāng)你在開發(fā)過程中發(fā)現(xiàn)出了大亂子,你想從上一個(gè)穩(wěn)定狀態(tài)重新開始時(shí)宿接,這個(gè)功能就派上用場啦赘淮。注意放棄更改這個(gè)功能沒有回頭路,點(diǎn)完之后你就沒有辦法再撤銷這個(gè)操作睦霎,所以梢卸,要小心使用啊副女!

之前蛤高,當(dāng)我們在討論版本比較時(shí),我們學(xué)會(huì)了如何忽略某一部分更改的方法,下面戴陡,我們要學(xué)一下如何一下忽略自從上一次提交之后的所有更改塞绿。

為了測試這個(gè)功能,首先寫一些代碼打開ViewController.h 恤批,添加一個(gè)公共方法聲明:

@interface?ViewController?:?UIViewController

-(void)aVeryCoolMethod;

@end

現(xiàn)在异吻,讓我們在ViewController.m中添加一個(gè)這個(gè)方法的實(shí)現(xiàn),簡單點(diǎn)就行:

-(void)aVeryCoolMethod{

NSLog("I'm?feeling?that?you'll?discard?me...?Really?");

}

如果你注意到Project Navigator喜庞,我們剛剛更改的文件旁邊有了一個(gè)M標(biāo)識诀浪,很好,我們想看看如果忽略這些更改延都,這些文件是否會(huì)回到更改之前的狀態(tài)雷猪。

這里有一個(gè)重要的細(xì)節(jié):你可以選擇忽略所有文件的更改,也可以選擇忽略單個(gè)文件的更改晰房,這完全取決于你求摇。如果你想忽略一個(gè)文件的更改,首先選定這個(gè)文件嫉你。在這個(gè)例子里月帝,如果你只選擇ViewController.m文件然后打開Source Control菜單躏惋,你會(huì)在ViewController.m中發(fā)現(xiàn)Didcard Changes這個(gè)選項(xiàng)幽污。類似的,如果你只選擇ViewController.h也是一個(gè)道理簿姨。然而距误,如果你想忽視這兩個(gè)文件的更改(這里假定有兩個(gè)以上的更改),就在Project Navigator中選中它們扁位,然后再打開Source Control菜單准潭。相應(yīng)的位置就會(huì)顯示Discard Changes in 2 Files,像下面這樣:

然而域仇,這次我們不會(huì)使用這個(gè)按鈕刑然,我們要用Discard All Changes。點(diǎn)擊它之后暇务,一個(gè)確定提示框就會(huì)出現(xiàn)泼掠,這是這部分Xcode防止你誤刪代碼的唯一措施。

點(diǎn)擊Discard All Changes, 那你剛才寫的那個(gè)公共方法就永遠(yuǎn)屬于過去了垦细≡裾颍看到了吧,只需幾步就可以讓你從當(dāng)前工作狀態(tài)恢復(fù)到之前的提交括改,所以我再一次提醒你要在使用Source Control 中小心點(diǎn)腻豌,別誤點(diǎn)了這個(gè)按鈕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市吝梅,隨后出現(xiàn)的幾起案子虱疏,更是在濱河造成了極大的恐慌,老刑警劉巖苏携,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件订框,死亡現(xiàn)場離奇詭異,居然都是意外死亡兜叨,警方通過查閱死者的電腦和手機(jī)穿扳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來国旷,“玉大人矛物,你說我怎么就攤上這事」虻” “怎么了履羞?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長屡久。 經(jīng)常有香客問我忆首,道長,這世上最難降的妖魔是什么被环? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任糙及,我火速辦了婚禮,結(jié)果婚禮上筛欢,老公的妹妹穿的比我還像新娘浸锨。我一直安慰自己,他們只是感情好版姑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布柱搜。 她就那樣靜靜地躺著,像睡著了一般剥险。 火紅的嫁衣襯著肌膚如雪聪蘸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天表制,我揣著相機(jī)與錄音健爬,去河邊找鬼。 笑死夫凸,一個(gè)胖子當(dāng)著我的面吹牛浑劳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播夭拌,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼魔熏,長吁一口氣:“原來是場噩夢啊……” “哼衷咽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蒜绽,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤镶骗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后躲雅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鼎姊,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年相赁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了相寇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钮科,死狀恐怖唤衫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绵脯,我是刑警寧澤佳励,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蛆挫,受9級特大地震影響赃承,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜悴侵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一瞧剖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧畜挨,春花似錦筒繁、人聲如沸噩凹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驮宴。三九已至逮刨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間堵泽,已是汗流浹背修己。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留迎罗,地道東北人睬愤。 一個(gè)月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像纹安,于是被迫代替她去往敵國和親尤辱。 傳聞我的和親對象是個(gè)殘疾皇子砂豌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

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