如何使用Git源代碼控制與Xcode 8

由Richard Critz更新為Xcode 8。Malek Trablesi的原創(chuàng)教程,之前由Felipe Laso-Marsetti更新。


無論您是獨立開發(fā)人員還是在團隊工作,如果您沒有為項目使用源代碼管理,您應該是。
源代碼控制是驚人的,因為它可以幫助您更輕松地恢復到舊版本的代碼,添加新功能,而不會對您的工作應用程序造成風險,看看代碼如何隨著時間的推移而發(fā)生變化,并且作為一個團隊工作。
而最好的源代碼管理系統(tǒng)之一就是Xcode - Git!

Git是最初由Linus Torvalds開發(fā)的分布式版本控制系統(tǒng),Linus Torvalds是Linux內核開發(fā)的主要力量。
關于Git的好處是沒有任何中央存儲庫 - 每個人都可以擁有自己的代碼視圖,并從其他來源引入更改。

在本教程中,您將掌握Git的經驗,并學習如何在Xcode中直接使用它。

開始啟動

而不是對Git的理論表示贊賞,你將會直接潛水并嘗試一下。
您將創(chuàng)建一個新的Xcode項目,并嘗試通常使用Git源代碼控制進行日常操作的一些任務。

啟動Xcode并創(chuàng)建一個新的Single View Application項目。


填寫模板選項如下:


產品名稱:GitUseExample

團隊:您的Apple開發(fā)人員團隊如果您有一個或無
組織名稱:您的姓名
組織標識符:如名稱所示,它是您組織的標識符(如果有)。否則,輸入任何內容。
語言:Swift
設備系列:iPhone
使用核心數(shù)據,包括單元測試和包括UI測試:未選中

現(xiàn)在點擊** Next。以下對話框允許您選擇保存項目的位置。
選擇一個位置,并確保在繼續(xù)之前選擇
Create git repository on My Mac庫。一旦這樣做,單擊 Create**。

注意:如果沒有看到復選框,請單擊** Options**.

Xcode將創(chuàng)建一個新的項目以及一個新的Git存儲庫。
包括Git在內的所有源代碼管理系統(tǒng)將其數(shù)據存儲到存儲庫中,從而可以管理項目版本,并在整個開發(fā)周期內跟蹤更改。
將存儲庫視為版本的數(shù)據庫。

4
4

在您的項目工作過程中,您將多次添加文件,修改代碼和更改項目。
在進行一系列更改后,您的項目處于“已知狀態(tài)”(通常每天一次或多次),最好檢查您對存儲庫的更改。
這給你一個可以隨時返回的“已知的好”狀態(tài)的記錄。
但是項目模板創(chuàng)建的代碼呢?
您的項目仍然只包含模板文件。
沒有什么可以讓你提交,因為Xcode在你創(chuàng)建項目時為你做了這件事。
要檢查,請從菜單中選擇Source Control \ History ...
源控制歷史記錄菜單
源控制歷史記錄菜單

在下拉窗口中,請注意有一個提交以及一些關于它的信息,包括提交標識符,日期和時間,做出提交的人,更改的文件和提交消息。
GitUseExample歷史記錄
GitUseExample歷史記錄

注意:通常,您可以單擊Show modified files按鈕,以查看有關提交內容的更多信息。不幸的是,由于Xcode中的錯誤,這只能在某些時間工作。您將學習一種不同的,更可靠的方式來查看以下信息。

現(xiàn)在,對您的項目進行一些更改。打開AppDelegate.swift并將方法更application(_:didFinishLaunchingWithOptions:)為以下內容:

func application(_ application: UIApplication, 
        didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
  print("Application did finish launching")
  return true
}

保存文件后,您將注意到,AppDelegate.swift現(xiàn)在在文件名旁邊有一個“M”標記:

修改了AppDelegate.swift文件
修改了AppDelegate.swift文件

“M”標記代表“已修改”。這意味著您已修改該文件,但尚未向本地Git存儲庫提交更改。

接下來,打開ViewController.swift,然后添加以下代碼viewDidLoad():

@IBAction func buttonClicked(_ sender: UIButton) {
  print("This is a Git tutorial")
}

現(xiàn)在,打開Main.storyboard并從對象庫中拖動一個按鈕到屏幕。
將按鈕的顯示文本更改為任何您想要的,如下面的屏幕截圖所示。


最后一件事是將動作連接到按鈕。
單擊View Controller場景中的黃色View Controller圖標。
從“連接檢查器”(右側欄中的最后一個選項卡),單擊buttonClicked:“接收的動作”面板旁邊的開放圓圈,然后將其拖動到故事板編輯器中的按鈕。從彈出菜單中選擇Touch Up Inside


如果您檢查項目導航器,您會注意到,您編輯的所有三個文件都有一個“M”標記。


構建并運行以確保項目工作。
驗證當您單擊按鈕時,您會看到“這是一個Git教程”消息記錄到控制臺。

按鈕操作控制臺日志
按鈕操作控制臺日志

w00t - 你的代碼現(xiàn)在處于“已知的好”狀態(tài)!
現(xiàn)在是時候承諾了。

做一些commit
提交文件很簡單!從菜單中選擇Source Control \ Commit ...


將顯示一個新窗口,類似于以下內容:
提交窗格
提交窗格

您可以看到,屏幕分為兩個窗格。左側窗格顯示該文件處于當前狀態(tài),并自上次提交以來進行了所有更改。由于這是您的第一個提交,您將看到自項目創(chuàng)建以來所做的所有更改。
在您進行更改之前,右窗格顯示該文件。
注釋提交窗格
注釋提交窗格

更詳細地查看提交窗口中Xcode的內容。

左側面板(1)顯示項目中的所有文件中未提交的更改。
默認情況下,Xcode假設您希望將其全部包含在此提交中并檢查其框。
如果要從此提交中排除文件,請取消選中。
正如您將在稍后看到的,您還可以決定在此提交中包含文件中的哪些單獨更改。
注意代碼窗格中的藍色亮點。這些表示您所做的更改。
任何更改,即使只添加或刪除空格,也被跟蹤,并將被標記這些藍色亮點。
嘗試一下自己。單擊* Cancel按鈕,打開ViewController.swift,并在文件末尾添加多條新行。
現(xiàn)在再次選擇
Source Control \ Commit ...*您的結果應類似于以下內容:


如您所見,Git會仔細跟蹤您在整個開發(fā)周期中所做的每一個變化。
在兩個源窗格之間的區(qū)域中,所有的更改都由Xcode(上面標記為“2”)列舉。
默認情況下會檢查每個更改。要從此提交中排除特定更改,請取消選中。
例如,更改3并不重要,因為它只包含您之前添加的空白行。
取消選中它,以使此更改未提交。


請注意,指示燈已變?yōu)榛疑?,表明此更改現(xiàn)在已從提交中排除。

排除個別變化的另一種方法是點擊更改號碼旁邊的箭頭。
將出現(xiàn)兩個選項:Don’t Commit(或** Commit,以防更改被取消選中)和 Discard Change。在這種情況下,請選擇Don’t Commit**

不要提交/放棄更改
不要提交/放棄更改

在您可以完成提交之前,Xcode要求您在屏幕的底部輸入提交信息(標記為“3”)。這些消息可以幫助您更好地了解每個提交的目的。


現(xiàn)在點擊Commit 4 Files.恭喜,你做了你的第一個提交!
如果您回到歷史記錄窗格,您應該在日志中看到新的提交:
承諾歷史
承諾歷史

這個簡單的改變過程就是你在90%的時間里做的。很簡單,對吧?現(xiàn)在你沒有任何借口不要這樣做。

注意:仔細的讀者會認為“我只更改了3個文件。為什么我提交4個文件?“Git跟蹤項目目錄中的每個文件,包括Xcode在幕后使用的所有文件。通常,這正是你想要的。您將在以后看到如何在需要時更改此行為。

Branching Out

Xcode支持的Git的另一個功能是將更改提交到特定的分支。但等等,什么是分支?
分支是將一組提交保留在一起的方式。通過在不同的分支機構工作,您可以將功能分開,并降低完全破壞項目的風險。
相信與否,你已經在使用一個分支。當首次創(chuàng)建存儲庫時,Git還會在該存儲庫中創(chuàng)建一個名為“master”的分支。
所有的工作到目前為止,都在主分支上。主分支應始終保留項目的主要副本。您使用其他分支作為存儲尚未準備發(fā)布的進行中的工作的方法。您也可以使用它們來存儲可能永遠不會被釋放的實驗。
例如,假設您要在應用中添加新的地圖功能,但尚未準備好進行生產。為了模擬這個,創(chuàng)建一個派生自NSObject它的新類并命名為
MapForItinerary。此時您的項目可能如下所示:

添加了一個文件
添加了一個文件

注意新文件MapForItinerary.swift的狀態(tài)“A” 。這表明這是一個尚未提交到存儲庫的新文件。
從菜單中選擇Source Control \ Commit ...
提交新文件
提交新文件

如果您選擇具有A狀??態(tài)的文件,您將注意到Xcode不提供任何早期版本進行比較。這是因為該文件尚未提交到存儲庫,所以沒有什么可以比較它。
將地圖功能添加到您的應用程序代表您的代碼很大的變化。這是使用分支的最典型的情況。如果您的新地圖代碼出現(xiàn)問題,這將有助于隔離風險。
而不是單擊Commit 3 Files按鈕,而不是單擊** Cancel。從菜單中選擇Source Control\GitUseExample\New Branch…請注意,當current branch** - ** master** - 顯示在菜單中。


Xcode要求您命名新的分支。
新分支名稱窗格
新分支名稱窗格

命名分支map_feature并單擊** Create
Xcode創(chuàng)建新的分支并切換到它。您可以通過打開
Source Control菜單來驗證這一點。
Source Control菜單顯示當前分支
Source Control菜單顯示當前分支

選擇
Source Control \ Commit ...,輸入提交消息,然后單擊Commit 3 Files**。


請注意,項目導航器中的文件旁邊的所有狀態(tài)信件已被清除。
這意味著您不再有任何未提交的更改。
沒有未提交更改的項目導航器
沒有未提交更改的項目導航器

要查看您的分支,請從菜單中選擇Source Control \ GitUseExample \ Configure GitUseExample ...。
配置Git項目
配置Git項目

在生成的窗格中選擇** Branches**選項卡。
Git分支
Git分支

Backing Out

您正在處理項目的最新版本,構建最新的酷功能。你休息一下吃了點零食,突然靈感來了,你想到了更好的方法來寫代碼。此時,您可能希望從源代碼控制恢復最新版本,并重新開始。

badstableversion
badstableversion

Git使這樣做很簡單!
打開Main.storyboard并從Object庫將一個新的視圖控制器拖到畫布上。
兩個視圖控制器
兩個視圖控制器

打開MapForItinerary.swift并添加方法sayHello()。

class MapForItinerary: NSObject {
 
  func sayHello() {
    print("Hello from MapForItinerary")
  }
 
}

請注意,修改的文件的狀態(tài)已更改為“M”,這意味著文件在本地被修改并且正在等待提交。
此時,您可以選擇性地丟棄對項目所做的更改。
選擇Main.storyboard在Project Navigator,然后選擇
Main.storyboard中 選擇Source Control\Discard 從菜單中。


Xcode將提示您確認您真的希望丟棄該文件中的所有更改。
舍棄提示
舍棄提示

點擊
Discard Changes
你應該看到剛剛添加的視圖控制器(和黃色警告圖標)消失了!當您添加一些更改但不起作用,并且您想要回到最后一個已知的良好狀態(tài)時,這可能非常有用。
除了丟棄整個文件的更改外,您還可以放棄單個更改。MapForItinerary.swift仍然有“M”標記。從菜單中選擇Source Control \ Commit ...。單擊更改號碼旁邊的向下箭頭,然后選擇Discard Change
選擇性丟棄
選擇性丟棄

哇!你的改變已經消失 因為沒有什么可以提交,只需點擊** Cancel關閉提交窗口。
現(xiàn)在你已經嘗試了
Discard Change,你可能會想知道與之前
選擇的
Do not Commit**選項有什么區(qū)別。
雖然這兩個選項都可以導致更改不被記錄在存儲庫中,但是存在很大的區(qū)別:
Don’t Commit允許您跳過更改,使其不會與其他更改一起提交,但仍將保留在本地源代碼中。
丟棄更改不僅可以跳過更改,還可以從本地源代碼中刪除它。

Time Travel

放棄更改是恢復工作代碼并節(jié)省時間的好方法。但是,在某些情況下可能會有一些限制。
Git允許您為每個版本具有特定更改的項目保存多個修訂版本。這些都存儲在由Git為您管理的存儲庫中。
如果選擇放棄對文件的更改,Git將恢復文件的最后一個提交版本,并且只保留最后一個。那就是限制的所在。

隨著時間的推移,您的項目庫將包含反映您開發(fā)歷史的多次修訂。假設您希望還原到特定文件的第一個或第二個版本。沒有辦法,只是通過丟棄變化。不要絕望,然而,隨著Xcode和Git做容易做的。

在Project導航器中選擇ViewController.swift?,F(xiàn)在從菜單中選擇View \ Version Editor \ Show Comparison View?;蛘撸梢詥螕鬤co??de窗口右上角工具欄上“編輯器”部分的第三個按鈕。

編輯器選擇按鈕
編輯器選擇按鈕

版本編輯器分為兩個窗格,如下所示:
比較視圖
比較視圖

這允許您比較所選文件的兩個修訂版本,并且與提交窗口中的比較視圖完全相同。
默認情況下,您當前的源文件顯示在左側,存儲在存儲庫中的最新修訂版本 - Git稱為HEAD - 顯示在右側。
要從存儲庫顯示早期版本,請單擊右窗格底部的時鐘圖標(以下標記為紅色),然后選擇較早的版本。
修訂列表圖標
修訂列表圖標

在HEAD版本之前選擇修訂版本,如下所示。您看到的確切信息將與截圖不同。


現(xiàn)在,要恢復到該文件版本,只需單擊比較窗格中更改號碼旁邊的箭頭,然后選擇Discard Change。這很容易!
放棄更改
放棄更改

完成還原到較早版本后,您將需要將此“新”版本的文件提交為最新版本。現(xiàn)在去做吧。
你怎么知道哪個早期的提交是你想要的?雖然你可以肯定地使用你之前學到的歷史命令,但是有一個更好的方法。單擊并按住版本編輯器按鈕,然后選擇** Log,您還可以從菜單中
選擇
View \ Version Editor \ Show Log View
選擇日志視圖
選擇日志視圖

Xcode將列出包含對當前文件的更改的提交。請注意,每個提交的列表包含提交標識符。
修訂記錄
修訂記錄

這些標識符與您之前使用的修訂歷史列表中顯示的標識符相匹配。
注釋修訂歷史列表
注釋修訂歷史列表

您還可以單擊
Show modified files 來更詳細地探討差異?,F(xiàn)在就試試!
另一個令人難以置信的有用的視圖在您的項目被稱為怪異視圖。此視圖顯示您的文件的每一行提供哪些提交。
切換到
Blame視圖。
單擊并按住版本編輯器按鈕,然后選擇
Blame。您還可以從菜單中選擇View \ Version Editor \ Show Blame View**。
選擇“怪”視圖
選擇“怪”視圖

您的屏幕將如下所示:
責怪視圖
責怪視圖

要查看有關承諾更改的更多詳細信息,請按日期旁邊的信息按鈕。所產生的彈出窗口顯示您做出提交的時間,提交時間,提交消息和提交標識符。它還有一個按鈕來顯示提交中修改的所有文件以及一個按鈕以打開比較視圖中的當前文件,并將此提交與HEAD提交進行比較。
顯示更多的責備信息
顯示更多的責備信息

Merging Branches

您以前學到Git允許您處理稱為分支的多個修訂流。您還了解到,除了主分支之外,在一個分支上進行所有開發(fā)都是一個很好的做法。那么當你完成一個功能的開發(fā)并且想要整合它時,你要做什么呢?簡單!您將開發(fā)分支合并到您的主分支。
您的新地圖功能尚未完成,但您的設計師在主界面上要求另一個標簽。要實現(xiàn)這一點,您將需要將map_feature分支留在現(xiàn)在,并從您的master分支的“已知的”狀態(tài)創(chuàng)建一個新的分支。
從菜單中選擇Source Control \ GitUseExample \ Switch to Branch ...


從可用分支列表中選擇master并單擊Switch。
切換到主
切換到主

確保您從正確的“已知良好”狀態(tài)開始您的新分支是很重要的?,F(xiàn)在,從菜單中選擇Source Control \ GitUseExample \ New Branch ...
創(chuàng)建新分支
創(chuàng)建新分支

將分支命名為new_label,然后單擊創(chuàng)建。
命名new_label分支
命名new_label分支

您可以通過單擊Source Control 并查看Working Copies.下的分支的名稱來驗證您正在處理new_label分支。
驗證你的分支
驗證你的分支

現(xiàn)在是時候添加您的設計師要求的新標簽。
切換回標準編輯器視圖,選擇Main.storyboard,然后拖動UILabel到主視圖。
我的新標簽
我的新標簽

構建并運行以確保所有都可以,然后將更改提交到存儲庫。確保添加提交消息。
現(xiàn)在切換到主分支并再次運行應用程序。正如預期的那樣,UILabel您在分行中添加
的新功能不在此。最后的工作就是將新的分支機構合并回主機。
從菜單中選擇Source Control \ GitUseExample \ Merge from Branch ...。
從分支合并
從分支合并

從可用分支列表中,選擇new_label,然后單擊** Merge。
選擇合并源
選擇合并源

將出現(xiàn)合并窗口,允許您控制合并進程。合并源(“合并從”分支)將顯示在右側。
合并修改的當前來源將顯示在左側。使用屏幕底部的按鈕來控制合并的方向。
對于這樣的簡單合并,Xcode的默認設置將是正確的。
合并窗口
合并窗口

最后點擊
Merge按鈕開始進程。
如果一切順利
UILabel當您單擊Main.storyboard**或運行應用程序時,應該會看到
新分支中的更改在用戶界面中顯示?,F(xiàn)在你的更改是在主分支,因為合并!使用您學習的查看提交歷史記錄的其中一種方法來驗證此更改是否顯示在歷史記錄中。
日志視圖提交歷史
日志視圖提交歷史

Ignoring generated files 忽略生成的文件

回過頭來,在你第一次把你看到的,除了你的源文件,跟蹤修訂由Xcode的文件。這很重要,因為這些文件與你的源文件一樣是你的項目所必需的。你需要他們重建你的應用程序或與他人合作。
然而,作為它的工作,還產生了其他文件,改變各建。它不是拯救這些Xcode重要可以自動恢復。事實上,保存它們會使Git做不必要的工作,并使您更難在提交歷史中發(fā)現(xiàn)重大變化。
Git提供了一種機制,忽略這些文件:適當命名的.gitignore文件。在其名字初使MacOS視它為一個隱藏文件,所以一般不會出現(xiàn)當你看在Xcode或查找你的項目。但是,不要害怕,因為Git會發(fā)現(xiàn)并使用它沒有問題。
而不是為自己做的一切放在你.gitignore* file, 你可以從此下載 gitignore.io.
首先,打開終端窗口并輸入以下命令。你只需要做這一步一次,而不是每一個項目

$ git config --global alias.ignore '!gi() { curl -L -s https://www.gitignore.io/api/$@ ;}; gi'

現(xiàn)在,對于任何使用Git的項目,在終端窗口中執(zhí)行以下操作:

cd <directory where your project is stored>
git ignore swift,macos >.gitignore
git add .gitignore
git commit -m "Add .gitignore file"

這下載最新的。寫銀行代碼在MacOS .gitignore配置。您的終端會話應該看起來類似:
注意你說的.gitignore文件到您的庫Git跟蹤由于過濾了也是你項目的一個重要組成部分

Xcode和GitHub

您迄今為止所做的所有工作一直在使用您計算機上保存的本地存儲庫。GitHub網站允許您將項目發(fā)布到保存在GitHub服務器上的遠程存儲庫。這是偉大的,因為它允許您輕松地與他人共享您的代碼,并以項目作為一個組。如果您還沒有GitHub帳戶,請轉到GitHub并注冊一個。
一旦完成,在GitHub上為您的項目創(chuàng)建一個存儲庫。單擊GitHub站點右上角的+按鈕,然后選擇* New repository

GitHub新的存儲庫
GitHub新的存儲庫

GitHub將向您顯示一個類似于以下內容的屏幕:
GitHub新的回購表
GitHub新的回購表

填寫存儲庫名稱,然后單擊
* New repository。GitHub將創(chuàng)建您的存儲庫并帶您進入快速設置屏幕。您可以忽略大部分屏幕。您需要將存儲庫的HTTPS URL保存到剪貼板。確保選中了HTTPS按鈕,然后單擊剪貼板圖標。
GitHub快速設置
GitHub快速設置

在Xcode中,從菜單中選擇
Source Control \ GitUseExample \ Configure GitUseExample ....選擇 Remotes選項卡,然后單擊+按鈕,然后選擇Add Remote….
添加遠程
添加遠程

遙控器的名稱將默認為“origin”。保留原樣并將您的GitHub HTTPS字符串粘貼到
Address字段中。單擊 Address。
遠程地址
遠程地址

最后點擊
Done。您現(xiàn)在可以在GitHub上發(fā)布您的項目!
從菜單中選擇
Source Control \ Push ....Xcode將提示您輸入遠程的名稱和分支。由于您只配置了一個遠程配置,默認值將是正確的。
遠程分支名稱
遠程分支名稱

點擊
Push。Xcode將提示您輸入您的GitHub登錄憑據。
GitHub登錄
GitHub登錄

輸入您的憑據,然后單擊
OK。
Xcode將您的憑據保存到macOS鑰匙串。您可以在Xcode首選項中的
Accounts**選項卡上管理它們。幾秒鐘后,Xcode將完成推送。
檢查您的GitHub頁面以驗證您的文件是否在那里。
驗證GitHub
驗證GitHub

注意:如果您在GitHub上設置了SSH憑據(請參閱GitHub SSH指令),Xcode支持使用SSH連接到GitHub。只需使用SSH連接信息而不是HTTPS字符串添加您的遠程。

現(xiàn)在是對您的項目進行最后一次更改的時候了。打開ViewController.swift并更改buttonClicked()方法如下:

@IBAction func buttonClicked(_ sender: UIButton) {
  print("You finished!")
}

從菜單中選擇Source Control \ Commit ....輸入提交信息,然后檢查左下角的Push to remote:。再次,由于您只有一個遠程配置,默認值將是正確的。


單擊Commit 1 File and Push。幾秒鐘后,Xcode將完成提交和推送。在您的GitHub頁面上查找您的新提交。
GitHub推確認
GitHub推確認

翻譯原文

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容