天天看點

了解 XCode 中的 Git 版本控制import “TestClass.h”

在應用程式開發過程中,一個相當顯著的部分是開發人員管理代碼變更的方式。這些是必須包含的功能,存儲和處理工作代碼版本在不同階段穩定階段的副 本,并能夠恢複代碼當存在缺陷或者産生問題的時候。更有甚者,當多個程式員工作在同一個項目時,跟蹤所有的變更是一個單向的路徑。幸運的是,開發人員不必 去發明一種方法來做這些事情,有一個特别的軟體解決方案,叫做版本控制系統(Version Control Systems)

版本控制系統或者叫做修訂控制系統,實際上是一種能夠一直監視代碼檔案的變更并存儲他們為了将來引用的機制(軟體)。除了這些之外,版本控制系統也 儲存了額外的必要資料,例如哪個開發人員做了變更,變更發生在什麼時候,實際上修訂了什麼,其他類型的曆史不僅僅是資料。而且,版本控制系統提供了比較代 碼不同版本的功能,如果需要的話,可以恢複特定檔案或者整個項目到以前的版本,并追查惡意的代碼最終實作無缺陷産品。

了解 XCode 中的 Git 版本控制

使用版本控制系統,開發人員可以工作在項目的不同路徑上,通常叫做分支(branch),當他們的代碼完成時,所有的代碼将合并到一起以便建構應用 程式的最終釋出版本。這個過程叫做合并代碼(merging),它包含了版本控制系統的一個特殊特性。實際上,在開發團隊和軟體公司中代碼的版本控制是一 個強制性的工作,團隊中的每個人負責項目的一部分,最後所有的代碼被集中到一起放置在一個地方。

對個人開發者來說使用版本控制系統不是必要的,但是仍然是強烈推薦的。一旦遇到嚴重的問題或者說以代碼都亂套了的時候,使用版本控制系統将更容易追 查缺陷或者恢複代碼到穩定版本和代碼的工作版本。事實上,許多的個人程式員,特别是新人,根本不使用版本控制系統,當他們增加新功能或者是修改代碼的時 候,通常手動複制項目的副本。這是一個非常不好的習慣,源碼控制能更好并且更有效率的完成這些工作,同時提供了前面描述的額外功能。

作為最出名的版本控制系統之一,git由Linux建立者 Linus Torvalds開發。Git在虛拟目錄(倉庫)中組織一切,實際上,任何版本的跟蹤都可以适用于他們。它既可以通過指令行使用,也可以通過桌面應用程式。如果git對你來說很陌生,那麼我建議你在網絡上閱讀一些關于git的文章,而進一步讨論git超出了本教程的範圍。

自從Xcode的第五版本起,就內建了git的豐富功能,包括各種選項菜單的按鈕和管理源代碼的子菜單。正像你稍後看到的,使用版本控制git是非常容易和快速的,在你看完本教程之後,沒有理由不使用它。

總結而言之,你已經了解了我們的任務是學習怎樣在Xcode中使用版本控制git,這一切将通過了解Xcode提供的每個相關特性來完成。如果你不 熟悉所有的東西,或者在我們開始之前你需要擷取更多的知識, 請在網絡上搜尋相關資訊。我不得不說,在本教程中我假設你關于版本控制系統擁有最基本的知識,比如git是什麼,是以我們要把它視為理所當然的事情,而關 注Xcode怎麼管理這一切。

Git示例示範

與其他教程的示範程式相反,本文中我們不會實作一個應用去展示iOS SDK的具體特性,也不會有一個最終的開發樣本。實際上我們所做的就是去建立一個示例項目,僅僅在幾個點上添加幾行代碼,我們将使用它作為一個工具去測試 Xcode提供的所有源代碼控制管理選項。換句話說,我們重點讨論的是IDE,而不是iOS。

除此之外,這一次不會有可供下載下傳的例程了。取而代之的是,我邀請你一起來一步步實作這個 demo,并且在需要寫代碼的地方手動添加代碼(别擔心,不會很多)。這樣跟下來是有必要的,因為我們将會重複進行多種與版本控制有關的操作,并且我們必 須即時看到結果。如果我隻是提供一個操作已經完成的例程,就不可能有這樣的效果了,因為這樣下來你自己的練習部分近乎于零。

那麼,讓我們開始吧!我們用 Xcode 來近距離地看一看版本控制系統的精華所在。

建立 Git 倉庫

每次在 Xcode 中建立新項目,都會讓開發者選擇是否要添加一個本地 git repository。建立一個 project 涉及分為3步的引導過程,其中在第3步也就是最後一步中,Xcode 提供了一個勾選框和相應的說明,如果勾選了,一個 git repository 就會添加到儲存 project 的目錄中。這個選項很容易被忽略,或者被當做一個 Xcode 的沒用特性,這種事經常發生,尤其是對于從來沒用過版本控制和 git 的開發者,或者新手程式員。

具體細節如下,啟動Xcode并建立一個新項目。首先,選擇“單視圖應用程式(Single View Application)”作為應用程式的模闆,同時在iOS選項部分,選擇“應用程式(Application)”項。

了解 XCode 中的 Git 版本控制

點選“下一步(Next)”按鈕到第二步,設定“産品名(Product Name)”字段為“GitDemo”,同時確定在“裝置(Devices)”下拉菜單中選擇“iPhone”。在這裡不需要iPad或者普通應用。

了解 XCode 中的 Git 版本控制

再次點選下一步按鈕,進入最後一步。在此,首先選擇儲存項目的目錄。然後選中視窗的底部的單選框,并選中在“My Mac”上建立git倉庫。

了解 XCode 中的 Git 版本控制

預設情況下,這個勾選框總是被選中的,然後每個 project 都會建立一個 git repo。如果你的項目不想用 git 和版本控制,隻需取消選中,但我不建議這樣做。總之,本教程中我們希望啟用git,是以確定你選中了勾選框。最後,點選 Create 按鈕。

等待 project 建立完成吧,然後打開一個 finder 視窗,來到我們儲存 project 的目錄下。在這裡,找到 .git 子目錄,這是 Xcode 自動建立的目錄,用來存儲 git repository 相關的資料。

了解 XCode 中的 Git 版本控制

如果你看不到 .git 目錄,你必須把電腦上的隐藏檔案改為可見。首先,打開Terminal(終端) 視窗,然後輸入以下指令:

對于 OS X Mavericks 10.9:

defaults write com.apple.finder AppleShowAllFiles TRUE

對于此前的 OS X 版本:

defaults write com.apple.Finder AppleShowAllFiles TRUE

然後,隻需重新開機 Finder 應用,是以再輸入一條指令:

killall Finder

是以,如你所見,這個 app 的本地 git repository 實際就儲存在這裡。相應地,你建立的任何新應用都會随之帶來一個 .git 子目錄,隻要你保持相應的選項是勾選的。

顯然,用 Xcode 來為 project 添加 git repository 是不費吹灰之力的。然而,如果你在建立 project 時沒有添加 git repository,或者想要稍後再添加,怎麼辦呢?好消息是,你随時都可以為 project 添加 repository,但是不用 Xcode 了。盡管這樣的情況很少見,我還是來講解一下。

注意,如果你不想看的話,可以盡管跳過本教程的下一節。但我建議還是讀下去,因為緊接着再下一節的内容會非常重要。

在開始講之前,你首先需要在 Xcode 裡下載下傳 Command Line Tools ,因為我們接下來要用 Terminal ,需要一些工具。如果你已經下載下傳了這個包,就進行下一步。如果沒有,要安裝 command line tools,點選Xcode裡的 Xcode > Preferences… 菜單,然後選擇 Downloads 一項。在視窗的上部,Components 一欄下,點選 Command Line Tools 右側畫着向下箭頭的按鈕。一旦下載下傳結束,下載下傳按鈕會變成對勾符号。

了解 XCode 中的 Git 版本控制

然後,為了這個例子再建立一個 Xcode project,我們一切完成之後再把它删除。這一次確定要取消勾選 Create git repository 選項。在這個例子裡,我們不需要 Xcode 來為我們準備 repository 了。把這個項目命名為 NoGitExample,并且儲存在桌面上,這樣就能直接使用我接下來的提供的指令了。

一切就緒,打開一個 Terminal 視窗(如果之前已經有打開的視窗,确定要先關閉再重新開機,這樣才能應用安裝 command line tools 時做出的改變)。首先,來到儲存新 project 的目錄下:

cd /Users/YOUR-USERNAME/Desktop/NoGitExample

别忘了把上面的指令改為你自己 Mac 的使用者名。接下來:

git init

這會初始化一個空的 repository。然後如果你打開 Finder 或者在 terminal 輸入 ls 指令,你會看到 .git 子目錄已經建立出來了。太棒了。繼續往下:

git add .

用這個指令,目前目錄(點号[.])的所有内容都會添加到 repository 中。最後,送出全部(也就是持久儲存所做的更改):

git commit -m ‘Initial commit’

Terminal 視窗中會出現送出到本地 git repository 的檔案清單。下圖就是我的terminal的樣子:

了解 XCode 中的 Git 版本控制

git repository 已經準備好了,但是如果你回到 Xcode,打開 Source Control 菜單,你會發現一切都還是不可用的。

了解 XCode 中的 Git 版本控制

這是因為 Xcode 不會自動被通知到,我們已經手動添加了 git repository。是以,點選菜單 Xcode > Quit Xcode 來關閉 Xcode ,然後再重新開機。現在,在 NoGitExample 項目中,如果你再打開 Source Control 菜單,你會看到這些的選項都可用了,跟我們建立 project 時就添加了 git repository 的效果相同。

了解 XCode 中的 Git 版本控制

到了這一步,就可以關閉這個 NoGitExample 項目,也可以把它從桌面上删除了。

現在你已經能夠知道怎麼為一個 project 添加 git repository了。并且即使你在建立 project 時有意或無意沒有添加 git repository,也可以随時手動添加。

送出更改

說到所謂的“送出更改到 repository”,我們實際的意思是:存儲我們項目的一個新版本。新版本包含目前已作出的所有更改,比如代碼修改或者新添加的檔案。一般來說,一次 送出應該發生在一定量的工作已經完成,并且項目處于穩定狀态之時。關于送出的頻率應該是多久一次,并沒有一定之規,但我建議:如果你認為從上一次送出到現 在之間,你所做的工作如果意外丢失,會造成巨大的時間精力浪費,那就一定要送出一下了。

Xcode 預設會在新項目建立時做一次初始送出,目的是儲存一個項目初始狀态的版本。這次送出是在幕後完成的,不會打擾你,也不會要求你确認。如果你在建立項目時沒有添加 git repository,是如前所述在之後手動添加的,初始送出是通過這個指令完成的:git commit -m ‘Initial commit’ 我們之前用過這個指令。

實際上,你可以看到初始送出的相關資訊,隻需點選菜單 Source Control > History… 。在這裡記錄了你對項目的每一次送出。

了解 XCode 中的 Git 版本控制

我們現在來嘗試一些操作吧,首先要對項目做點改動。來到 ViewController.m 檔案,在 private class 部分添加以下的 property 聲明:

1

2

3

4

5

@interface ViewController ()

@property (nonatomic) int sum;

@end

接下來,修改 viewDidLoad 方法如下:

1

2

3

4

5

6

7

8

9

10

11

12

  • (void)didReceiveMemoryWarning

    {

    [super didReceiveMemoryWarning];

    // 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 (即左邊欄),你會注意到在 ViewController.m 檔案後面,多了一個字母 M,如下圖所示:

了解 XCode 中的 Git 版本控制

這意味着這個檔案已經被修改了,并且相比上次送出的版本确實有改動。一般來說,每次你改動一個檔案之後,字母 M 就表示已有改動,還未送出。

讓我們來看看怎麼送出代碼。這是很簡單的,僅需要打開Source Control > Commit菜單,如下視窗所示:

了解 XCode 中的 Git 版本控制

一步一步的讓我們看看它告訴了我們什麼。在左邊方框(在圖檔中辨別為#1的部分),這兒列出了所有已修改的檔案。在我們的例子中,僅僅ViewController.m檔案被修改,是以僅僅顯示了一個檔案。如果你仔細觀察,你将看到檔案的左側有一個預設選中的複選框。假如你不選中它,已經修改的檔案将不會被送出。但是現在這不是我們想要的東西,是以讓它被選中。

在視窗的中間位置(辨別為#2的部分),有兩個預覽框。左側是檔案的目前版本(沒有送出的),右側是檔案的最近送出的版本。截圖描繪了ViewController.m檔案的原始狀态。

左欄的藍色區域(圖中辨別為#3的部分),在右欄變成一條線,這顯示了檔案中的實際改動。這樣的表示法讓所有的改動一目了然,并且能對應到改動的具體位置 (行号)。也許你注意到了,視窗的中央,在兩個預覽欄之間,有一些小的圓角标簽,上面寫着數字(圖中辨別為#4)。這些标簽一個一個地數出了全部的改動, 上面的數字就是計數的序号。在數字左邊,有一個對勾符号。如果出現了這個對勾,說明對應的改動可以正常送出到 repository。盡管如此,你還是可以選擇跳過,暫時不送出檔案的某一個或幾個改動,甚至抛棄所做的更改,隻需點選數字右邊的小下三角。含有兩個選項的小菜單将會浮現:

了解 XCode 中的 Git 版本控制

如果你選擇 Don’t Commit 選項,對勾符号會換成禁止符号,對應的改動就不會送出到 repository 了。

了解 XCode 中的 Git 版本控制

如果你選擇菜單中的 Discard Change 選項,會出現一個确認視窗,提醒你選中的改動将會被復原,并且復原是無法被撤銷的。

了解 XCode 中的 Git 版本控制

如果你點選 OK 按鈕,響應區域中的改動會消失無蹤,仿佛從沒來到世上。

如果你有留心觀察上面的送出視窗截圖,你會發現所有的修改都會被 Xcode 認為是改動,即使一個空行也不例外。事實上,空行是螢幕上不顯示的換行符,是以它被收集為一項改動是合情合理的。

總之,對于這個樣例,確定你沒有丢棄任何改動,允許一切都送出。是以你應該看到所有的圓角 label 上都有對勾。

在這兩欄之下是一片空白區域,中間寫着“Enter commit message here”。這個區域用來附加一些簡短資訊,描述這個版本所做的更改。點選它,填上下圖所示的内容:

了解 XCode 中的 Git 版本控制

填寫(有意義的)送出資訊至關重要,尤其是在送出次數很多的情況下。是以,要把它當做不可或缺的一步。

既然我們已經浏覽了一遍這個視窗的主要内容,下面我們來做第一次送出吧。在視窗的右下角,有一個按鈕寫着:Commit 1 file.

了解 XCode 中的 Git 版本控制

在這個按鈕裡,總是會寫着送出的檔案總數。點選它,然後恭喜!你的第一次送出已經誕生,将會永久載入曆史,不僅是你個人的曆史,也是 git 的曆史。這是什麼意思呢?隻要打開菜單上的 Source Control > History…,就可以看到它列在這裡。

了解 XCode 中的 Git 版本控制

如你所見,我們之前寫的送出資訊以及改動的檔案總數都出現在這裡了。在 Xcode 做出的初始送出中,送出了所有檔案;但是我們隻改動了其中一個。

除此之外,如果你關閉 history 視窗,再看看 Project Navigator 左邊欄,ViewController.m 檔案旁邊的 M 字母也消失啦!

現在,我們準備再做一次送出吧。這一次,我們來為項目添加一些新檔案,最好的方式莫過于建立一個新類。那麼,按下鍵盤上的 Command + N 鍵,然後添加一個 Objective-C class。把它設為 NSObject 的子類,命名為 TestClass。最後,添加到項目中。

一旦上面這些都完成了,注意左邊欄 Project Navigator 中的兩個類檔案旁邊都出現了一個字母 A ;意思是這兩個檔案是後添加到項目中的,是以自然它們還沒有被送出過。

打開 ViewController.h 檔案,然後 import 我們的類:

1

import “TestClass.h”

接下來,打開 ViewController.m 檔案,如下聲明一個 private 屬性:

1

2

3

4

5

6

7

@interface ViewController ()

@property (nonatomic) int sum;

@property (nonatomic, strong) TestClass *testClass;

@end

再看左邊欄 Project Navigator,注意到現在有4個沒有送出的檔案了。兩個類檔案是我們剛添加的,還有另外兩個本來就有的檔案。我們需要将這些改動也送出,是以打開 Source Control > Commit… 菜單。

了解 XCode 中的 Git 版本控制

這一次,選中了5個有待送出的檔案。第5個檔案(顯示在第1行)是項目的配置檔案,是在添加新類時由 Xcode 自動修改的。如果你點選 TestClass.h 或 TestClass.m 檔案,左(譯者注:原文可能筆誤,此處應該為“右”)欄會變為一片空白,如下圖所示:

了解 XCode 中的 Git 版本控制

這是因為這兩個檔案之前沒有送出過,是以沒有之前的版本可以對比。是以,右欄裡隻寫着“File was added” 就是再正常不過的了。

來到送出資訊區域,填寫送出資訊: TestClass class was added to the project。完成之後,點選 Commit 5 files 按鈕,讓 Xcode 送出更改到 git repository。

第二次手動送出已經順利完成了。可以打開送出曆史來驗證,在菜單 Source Control > History… 中:

了解 XCode 中的 Git 版本控制

版本對比

在你送出了多個版本之後,對比各個版本、跟蹤代碼的變化是非常容易的。當新添的代碼不能如預期工作時,版本對比顯得尤為重要,因為你需要找到從上個穩定版本以來的所有變化。

要比較兩個不同版本的檔案,或者點選菜單裡的 View > Version Editor > Show Version Editor,或者點選工具欄上的 Version Editor 按鈕,如下圖所示:

了解 XCode 中的 Git 版本控制

一旦上面這一步完成,編輯器就會分裂成兩部分。最開始,左、右欄都顯示目前版本的檔案。要把任意一欄切換為某個之前送出的版本,來到這一欄底部的工具欄,點選最後一個按鈕,上面有時鐘标志:

了解 XCode 中的 Git 版本控制

一瞬間,選擇的版本對應的差異就顯示在螢幕上了。一般來說,左欄用來顯示目前版本的檔案,而右欄用來通路舊的版本。之前提到過的藍色區域表示了更改的代碼,能輕松跟蹤代碼的增加。是以,再往下進行,選擇任意一個之前的送出,觀察兩欄顯示出的差異。

了解 XCode 中的 Git 版本控制

你應該注意到,在兩個編輯器的方框之間,有我們在送出視窗中第一次看到的圓形标簽。點選它們中任意一個向下箭頭,将顯示放棄改變的選項。如果你點選 它,Xcode會要求你确認,如果你同意了,已經選擇的代碼将永遠的被放棄,沒有任何的機會恢複。是以,要小心,不要放棄任何一片代碼,甚至是在偶然的情 況下。

除了上面介紹的方法,你還有一個方法你可以恢複到以前的版本。如果你仔細觀察兩個方框下的工具條,在它的中間有一個帶時鐘和箭頭的按鈕。

了解 XCode 中的 Git 版本控制

如果你點選了它,兩個方框之間列将改變并且标簽将被以前送出的一系列時間戳替換。請注意不是他們所有都代表了真實的送出,這取決與送出的總量,圓角矩形的真實數字比對以前版本的實際數量。例如,在我們的應用程式中在底部僅僅有兩個形狀比對了真實的送出。

在這一欄底部,有兩個箭頭。左邊的箭頭屬于左欄,指向右邊;右邊的屬于右欄,指向左邊。把這兩個箭頭拖到任何一個曆史版本,你可以立即看到這個版本出現在對應的一欄中。如果你想對比目前版本和任何一個曆史版本,隻需讓一個箭頭指向 local 一行,然後拖動另外一個箭頭。時間戳的順序,從頂到底是從最新到最舊。這意味着寫着 base 的一行,代表上一次送出的版本;而再往上看,就是那些更老的版本。下圖總結了我剛才所描述的:

了解 XCode 中的 Git 版本控制

現在你知道如何對比版本,并跟蹤代碼在各個版本的變化了。現在随便玩一玩這個特性吧,之後我們再往下講。

是誰的責任?

在比較檔案的版本之前,Xcode允許追查誰送出了代碼,還有誰修改了那部分的代碼。如果一個項目是多人開發的話,這是一個非常有用的功能。隻需簡單地打開視圖View > 文本編輯Version Editor > 展示責任視圖Show Blame View 菜單,或者保持滑鼠按鈕在工具欄的文本編輯Version Editor按鈕上,然後選擇責任Blame選項。一個如下圖所示的新視窗就會展示在你面前:

了解 XCode 中的 Git 版本控制

正如你所看到的,被選檔案的代碼是根據所送出的人的不同而被水準線分割了好幾部分。根據送出的資訊,每一部分的代碼的作者,以及其他相關資訊會展現在視窗的右側中的一個特殊的窗格裡。

如果你還沒有完成上一步,打開責任視圖,注意看 Xcode 是怎麼用不同送出和不同作者來差別呈現代碼塊的。這樣的界面可以非常快速地定位到某一塊代碼是什麼時間送出,誰送出的,還可以獲得一些額外資訊。這些額外資訊隻要把滑鼠移到責任欄上就可以看到。當滑鼠放在一個送出片段上時,你可以看到最右出現了一個畫着 i 辨別的小按鈕。如果你點選它,就會選中這段代碼,并彈出一個視窗,上面顯示着全部的送出資訊。通過這個視窗,你可以切換到對比視窗(标為 #1)以及本次送出修改的檔案(标為 #2)。

了解 XCode 中的 Git 版本控制

除了上一節我們看到的對比視圖和剛剛介紹的責任視圖之外,還有一個日志視圖,可以通過 View > Version Editor > Show Log View 通路到;或者在工具欄上長按 Version Editor 按鈕,然後選擇 Log 選項。我不再詳細說了,留給你自己試試吧。畢竟,了解日志是什麼、怎麼用并不難。

分支

想象你的項目有一個可用的版本,準備釋出,或者已經釋出了;現在你想開發一個新特性,但又不想意外毀壞了目前穩定可用的程式。在這種情況下,要避免可能的災難性後果,保證你的項目不會被弄毀,你應該怎麼做呢?答案很簡單:用分支。

要清楚了解什麼是分支,可以把你的項目想象成一棵樹,其中樹幹永遠是項目主要的、穩定的、可用的版本。而任何新添加的特性,都必須先成為樹幹的一部 分,然後才能進入釋出階段。在版本控制系統中的“分支”,就像樹的樹枝一樣,從樹幹長出來,沿着一個不同的方向生長。在 git (最終在 Xcode)中,你可以建立分支來為代碼開辟一條新路(如實作一個新特性),而不用擔心在開發時會損壞目前可用的版本。

實際上,git 總會預設建立一個分支,名為 master。Xcode 進行的初始送出,就是在這個分支中進行的。一般來說,單打獨鬥的開發者會隻用這一個分支工作,盡管這是個壞習慣。無論你是單獨工作還是在團隊裡,我認為都 應該在你要做重大改動或添加時使用分支,這樣可以避免陷入麻煩。當然,在團隊合作的項目裡,個人開發的部分幾乎是必須要在一個單獨的分支裡完成的。

記住以下兩點很重要:

  1. 送出到 App Store 或客戶手中的最終産品,一定是 master 分支的版本。
  2. 任何處于次級分支的代碼或實作的特性,都必須先合并到 master 分支,之後才能被包括進應用的正式釋出(稍後還将談到)。

當你開了一個新分支開始工作時,事實上這個新分支就是從目前的地方開始的,即使還有沒送出的更改也不例外。從此以後,再做出的代碼更改就是隻在新分支上了。

現在回到Xcode。去建立新的分支,到資源控制Source Control > GitDemo – master > 新分支New Branch…菜單,你會看到如下圖所示的視窗:

了解 XCode 中的 Git 版本控制

給該分支取個名。我給它取名為(正如你在下圖所看到的)AnotherBranch,在這裡你取什麼名它都不會有所不同。然後點選OK按鈕,等待一段時間直到新分支被建立好,且目前的代碼被複制到該分支上。

你可以很容易地找到你目前活躍的分支是哪個。簡單地打開資源控制Source Control菜單,旁邊的項目名稱的選項那裡就可以看到你目前的分支。

了解 XCode 中的 Git 版本控制

現在,讓我們送出代碼到新的分支。在做這個之前,讓我們增加一些新的的代碼,是以進入私有類區域,增加如下的方法聲明:

1

2

3

4

5

6

7

@interface ViewController ()

-(void)sayHello;

@end

然後,實作它:

1

2

3

-(void)sayHello{

NSLog(“Hello”);

}

最後,在 viewDidLoad方法中調用它:

1

2

3

4

5

6

  • (void)didReceiveMemoryWarning

    {

    [self sayHello];

    }

現在,切換到 Source Control > Commit菜單,将顯示版本比較視窗。你将看到僅僅一個已修改的檔案 ViewController.m将要送出,并且新增加的代碼高亮顯示。

送出代碼并且增加如下的送出資訊:第一次送出到分支,然後點選Commit 1 File按鈕。改變将發生在AnotherBranch分支

打開版本編輯器(菜單視圖 View > 版本編輯器Version Editor > 顯示版本編輯器Show Version Editor),然後再到右邊編輯視窗下面的工具欄中。你會看到被選擇的分支是AnotherBranche。點選它,這時候該分支和主分支都會出現。從主分支上,選擇你想要的任何一個版本,Xcode就會把AnotherBranch分支上的目前版本和主分支上被選擇的版本之間的變化高亮出來。采用這種方式,以及我們之前的教程所談到的比較版本部分的内容,你都可以很輕松地追蹤到你工程中所有分支之間代碼的變化。

了解 XCode 中的 Git 版本控制

最後,切換到另一個分支,或者主分支,進入資源控制Source Control > GitDemo – AnotherBranch > 切換到另一個分支Switch to Branch… 菜單:

了解 XCode 中的 Git 版本控制

從出現的視窗中,選擇你想切換到的分支,在我們這個例子中選的是主分支:

了解 XCode 中的 Git 版本控制

選擇它并點選切換Switch按鈕。主分支就會再次變成目前活躍的分支,你會發現那些隻有在AnotherBranch分支中所做的變化都不會在這裡出現。這很棒,因為我們能夠成功地推動我們的工程,而不需要修改穩定的版本。

合并分支

在主分支以外的分支上工作,這在執行狀态中是很好的習慣。然而,如果任何代碼的添加或者修改都意味着要在應用程式下一個版本中出現的話,這就必須放到主分支上,是以在這一部分,我們将會看如何完成這項任務。正如标題所總結的一樣,我們談論的這部分功能就叫合并,以及Xcode提供的一種快速合并兩個分支版本的方法。

讓我們做一個小實驗來看看如何合并工作。首先要确定你現在處在主分支上。如果不是,請到資源控制器Source Control > GitDemo – AnotherBranch > 切換到另一個分支Switch To Branch…菜單中,并在彈出視窗裡選擇主分支。

接着,用資源控制器Source Control > GitDemo – master > 建立分支New Branch… 菜單建立一個新的分支,取名為LastBranch。

了解 XCode 中的 Git 版本控制

給Xcode一點時間去準備。現在,在ViewController.m檔案中建立一個或多個假的私有方法,并聲明它:

1

2

3

4

5

6

7

8

@interface ViewController ()

-(void)sayByeBye;

@end

然後實作它:

1

2

3

-(void)sayByeBye{

NSLog(“Bye - Bye”);

}

最後,在viewDidLoad方法中調用它:

1

2

3

4

5

6

  • (void)viewDidLoad

    {

    [self sayByeBye];

    }

在合并之前,該分支上做的修改必須先送出到本地倉庫。是以,在資源控制器Source Control > 送出Commit…去執行送出。

言歸正傳。合并兩個不同的分支到一個分支上,你有兩種選擇:

從分支上合并Merge From Branch: 你可以選擇在分支上做過的任何修改來合并到目前工作的分支上。

合并到分支上Merge Into Branch: 你可以選擇在目前工作的分支上做過的任何修改合并到分支上。

這兩種選擇你都可以在資源控制Source Control > GitDemo菜單裡找到。注意,當你目前活躍的分支是主分支的話,第二個選擇是不可用的。

現在假設有一個開發者在我們之前建立的AnotherBranch分支上開發并在上面實作了sayHello的方法,而另一個開發者在LastBranch上開發并實作了sayByeBye的方法,而你的任務就是把這兩個新增的都添加到應用程式中下一個穩定版本。你打算怎麼做?簡單來說,當具備主分支活躍,你得先從其他兩個分支進行如下合并:

首先,確定你工作的是主分支,如果不是要先切換到主分支上。

然後,打開資源控制器Source Control > GitDemo - master > 從分支合并Merge From Branch…,然後從視窗打開并選擇AnotherBranch分支并點選合并Merge按鈕。

了解 XCode 中的 Git 版本控制

一個版本比較的視窗将會出現,在那裡就會有機會再合并代碼前重新審查所有代碼修改過的地方。如果你需要,我們可以快速浏覽一下,當你準備好了,就可以再次點選合并Merge按鈕。

了解 XCode 中的 Git 版本控制

當Xcode詢問你有關該項目快照的事,點選啟用按鈕繼續。稍等片刻,瞧!AnotherBranche分支已經合并到主分支上了。

按照同樣的方法,從LastBranch分支中合并過來。你就會發現如果你沒有送出本次版本修改過的檔案,Xcode不會讓你再次合并。是以,唯一的方法隻有,先送出。送出完了再嘗試從LastBranche分支上合并。在版本比較的視窗中你會發現一些紅色的區域,表示這些修改的地方會在合并之後代替藍色那部分。這意味着要合并過來的分支上的代碼将會代替目前正在工作的主分支上的相同行數的代碼,如下圖所示:

了解 XCode 中的 Git 版本控制

如果你使用編輯視窗下的工具欄按鈕,你可以很容易避免這種情況,并保持現有的和新增的代碼。在選擇的區域内,點選圓形上面帶箭頭的按鈕,可以使用所 有按鈕來檢視他們的效果。在下面的截圖中,我選了第一個按鈕,意味着存在在主分支上的代碼将會置于從其他分支合并過來的代碼的前面:

了解 XCode 中的 Git 版本控制

仔細檢查所有修改過的地方,确認任何分支裡的代碼都沒有被排除在外。一旦你完成了,你要确認所有代碼都在的,然後就點選合并Merge按鈕。

恭喜!你已經成功從多個分支中合并代碼到一個分支上了,現在你知道如何用Xcode處理類似的事情了。

放棄修改

這個選項是對放棄那些在工程中不想被修改的檔案非常有用的,因為隻需要點選一下滑鼠就可以撤銷所有自上次送出到目前所做的操作。當實作的方式不是預 期的方向,而你想從上次送出的版本重新開始工作,這時候就非常有用。注意,放棄所有改變的操作是不可恢複的選項,是以,如果你不小心做了這個操作,你将沒 有任何機會恢複到你剛剛所做的工作。是以,要謹慎。

在此前,當我們讨論版本對比的時候,我們第一次看到了如何通過在編輯器視窗之間使用每個标記區域的小菜單按鈕來放棄指定代碼段的修改。這裡,我們将看到如何在整個項目中執行放棄操作,并瞬間恢複到上次送出的版本。

測試這部分的目的,打開ViewController.h檔案,添加一個公共方法聲明:

1 @interface ViewController : UIViewController

2

3 -(void)aVeryCoolMethod;

4

5 @end

現在,在ViewController.m 檔案添加一小段這個方法的實作:

1 -(void)aVeryCoolMethod{

2 NSLog(“I’m feeling that you’ll discard me… Really?”);

3 }

如果你注意到了項目導航欄,M标志旁已經添加了我們建立的兩個檔案。這正是我們想要的看到的,如果取消了變化,所有修改的檔案将會受影響并恢複到先前的狀态。

這裡有個很重要的細節需要提一下:你可以放棄所有檔案之前所做的修改,也可以放棄部分指定檔案修改。這個決定在于你,如果你想選擇性放棄,那麼請首先確定選的檔案是你想放棄修改的。為了讓後面可以看得清楚點,如果你隻選擇ViewController.m檔案然後打開資源控制(Source Control)菜單,你會發現在 ViewController.m會有個标題為“放棄修改(Discard Changes)”的選項。同樣的,如果你隻選擇ViewController.h檔案并打開相同的菜單,你也會在ViewController.h中發 現放棄修改(Discard Changes)的選項。不過,如果你想同時放棄這兩個檔案的修改(并假設這裡面會有超過兩處的修改),隻需在項目浏覽器(Project Navigator)選擇他們并再次打開資源控制器(Source Control)菜單。相應的指令變成放棄這兩個檔案的修改……如下圖所示:

了解 XCode 中的 Git 版本控制

在這個例子中,我們不打算使用這個選項,用放棄所有改變(Discard All Changes)來代替。通過點選它,螢幕上就會出現确認的提示視窗,這是Xcode防止你誤操作的方式。

了解 XCode 中的 Git 版本控制

點選放棄所有改變(Discard All Changes…)提示框的按鈕,公共方法就會恢複到原來的樣子。正如你所見,放棄所有改變僅僅是點選幾下就會遠離你現在的狀态,是以我再次提醒你,當你想放棄之前操作的時候要非常小心,尤其是你通常都使用資源控制器(Source Control)菜單。

總結

在本次教程中,我努力深入細緻地把如何使用Xcode管理版本和資源控制講述給大家。在幕後,真正工作的其實是git,一個非常流行和非常有用的版本控制系統。你或許發現文中并沒有提及到GitHub或 者任何有關Xcode功能的地方,但是我這麼做的目的,是想完全關注在通過Xcode進行的git管理上,除此之外,如果你知道如何處理版本控制,你也可 以直接使用GitHub。進一步說,正如我在教程開始時候經常提到的,如果你是團隊中的一員,那麼用版本控制系統來工作是強制性的。如果你是個人工作而且 你之前沒用這個的話,那麼也強烈地建議、鼓勵你現在開始使用Xcode的版本控制。這是一種保證你不會對現成的工作造成任何的損害,也不會增加工作量的方 式,除此之外,當添加新的功能來拓展你的應用程式時也變得非常容易。最後,我希望前面所展示的例子是有幫助的,以及使用Xcode來管理版本是能夠有效地 節省工作時間的。

和往常一樣,你可以随時留下評論來分享你的看法。

本文位址:http://www.oschina.net/translate/git-source-control-in-xcode

原文位址:http://www.appcoda.com/git-source-control-in-xcode/