git的使用1[轉]

在應用程序開發過程中,很重要的一部分工作就是如何進行源碼的版本控制。當代碼出現問題時,我們就需要將代碼恢復到原先正常的版本。如果是多個人共同開發一個項目,那么代碼的控制就會非常復雜。幸運的是,開發者不需要自己控制這些,因為有專門的軟件來負責,叫做版本控制系統。


版本控制系統,或者說修改控制系統,實際上是一種檢測源文件的改變并將其保存留作以后參考使用的機制(軟件)。此外,它還能記錄其他有用信息,比如是哪個開發者修改了代碼,何時修改的,修改了哪一部分,以及其他歷史信息。版本控制系統可以比較不同版本代碼的不同,有必要時能恢復整個項目到以前的版本,追蹤有害代碼從而減少產品的錯誤。

?

通過版本控制系統,開發者可以在一個項目的不同分支上工作,當項目的各個部分開發完備時,將它們放到一起形成最終的版本,這個過程被稱為合并。事實上,這種做法再團隊和軟件公司中相當常見:每個人負責項目的一部分,最終所有部分被整合到一起形成最終產品。

?

對于個人開發者來說,版本控制系統并不是必需的,但是我們仍然強烈推薦開發者使用它,因為它可以使代碼方便的在有錯誤的版本和可以工作的版本之間轉換。事實上,很多開發者從來不使用類似的工具,他們會在項目添加新的功能時手動保存原先的項目。這其實是一個很不好的習慣,因為版本控制軟件可以更好更高效地完成這項任務。

?

Git是一個常見的版本控制系統,它最開始是由Liunx之父Linus Torvalds開發的,Git使用虛擬目錄,又稱為repositories,來管理一切事物。Git可以通過命令行調用,也有專門為它設計的桌面應用軟件。如果Git對你來說很陌生,我建議你在網上查看一些它的相關信息。關于Git更深層次的內容都不在本文的討論范圍之內。

?

從Xcode5開始引入了使用git的一些新特性。它將git的各項功能整合到一個菜單中,并提供子菜單來進行軟件合并的控制。在接下來的閱讀中你會發現,使用git來進行版本控制相當的簡單快捷。

?

我們接下來的任務就是學習如何在Xcode中使用git,以及Xcode是如何整合Git的各項功能。如果你覺得對這些很陌生,我建議你先上網搜索一下相關的內容。在接下來的教程中,我會假定你已經了解了版本控制系統和git是什么,并將注意力集中在Xcode如何管理它上。


GIT Demo概述(GIT Demo Overview)

與其他教程中的demo app不同,這次我們不會去實現一個應用來演示某一項iOS SDK特性,最終我們也不會產生一個示例產品。實際上,我們會新建一個demo工程,寫幾行代碼,然后利用這個工程來演示Xcode提供的版本管理功能。換句話說,我們會集中注意里于IDE上,而不是iOS本身。

?

我建議你跟著我一起一步一步實現這個實例項目,在相應的地方手動添加代碼,不用擔心,代碼量不是很多。跟著教程的步驟,我們將執行多種重復的版本控制相關的操作,并且我們必須實時看到結果。如果我只是提供了一個具備所有操作的的應用,那么你無法體會到這些改變。

?

好了,廢話不多說了,讓我們仔細看看使用Xcode進行版本控制的要點吧。

?

創建一個Git源(Creating a Git repository)

每次在Xcode中創建新工程的時候,都會提示開發者是否將項目作為一個本地的git源。在創建工程的最后一步Xcode會有一個復選框,如果選擇了它,git源就會被添加到工程目錄中。通常這個選項會被忽視,或是被認為是Xcode的另外一個沒用的功能,尤其是從未用過git的開發者,或是編程新手。

?

打開Xcode,創建一個新的工程。選擇iOS區的“Application”,在應用模板頁選擇“Single View Application”。

選擇下一步,在項目名中輸入GitDemo,確保下面的Devices菜單選擇iPhone,無需iPad或者universal app。

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

默認情況下,這個選項是被選上的,如果你不想使用git,你可以取消它,但是我不建議這么做。本教程中,你需要將它勾選上,然后點擊創建按鈕。

?

創建完項目之后,打開Finder,找到項目存儲的目錄,在目錄中,有一個.git的子目錄,時Xcode為存儲git源相關數據自動創建的。

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


對于OS X Mavericks 10.9:

  1. defaults?write?com.apple.finder?AppleShowAllFiles?TRUE??

?

對于以前的OS X版本,

  1. efaults?write?com.apple.Finder?AppleShowAllFiles?TRUE? ?

?

為了重啟Finder應用,輸入

  1. killall?Finder??

?

這就是本項目在本地git源保存的位置。實際上,如果你選上了相應的選項,這個目錄就會被創建。相應地,在你創建新應用時,.git子目錄也會一同被創建。

?

顯然使用Xcode創建一個git源毫不費力,然而,如果你在項目創建時未創建git源,之后又想加上這個功能怎么辦呢?好吧,其實你可以在任何時候為你的項目創建源,但是不是使用Xcode。盡管這種情況很少發生,我還是會告訴你該怎么做。

?

如果你愿意的話,你可以直接跳到本教程的下一部分。我建議你接著讀下去,因為接下來這些信息還是很有用的。

?

在進行演示前,你需要首先通過Xcode下載Command Line Tools,因為我們要在Terminal下操作,并且需要一些額外的工具。如果你還沒有下載,那就去Xcode>Preferences…菜單,選擇Download選項卡,展開Components區,點擊Commond Line Tools右邊下載按鈕。下載完成后,一個對勾符號會取代下載按鈕。


?

現在,為這個例子再創建一個工程,完事后可以刪了它。在創建時取消那個創建git源的選項。這次我們不想讓Xcode為我們準備一個源。把這個工程命名為NoGitExample,保存到桌面,然后你可以跟我接下來輸入的命令一樣。

?

一切準備妥當后,打開Terminal窗口(如果你之前打開了一個,那就先關掉它再重啟,從而使我們安裝的命令行工具生效)。下面切換到新項目的目錄:

  1. cd?/Users/YOUR-USERNAME/Desktop/NoGitExample??

別忘了在上邊命令中設置Mac的用戶名,接下來,輸入:

  1. git?init??

?這會初始化一個空的源,如果你在Finder里面查看或是輸入ls命令,你會看到.git子目錄已經被創建,很好,接下來輸入:

  1. git?add?.??

這樣,當前目錄所有的內容就被添加到源里面去了,最后,輸入以下命令:

  1. git?commit?-m?'Initial?commit'??

接下來會出現一個本地git源所執行的改變列表,如下圖所示:

現在git源就建好了,但是如果你回到Xcode,打開Source Control菜單,你會發現一切仍然是被禁用。

這是因為當我們使用命令行工具創建git源時,Xcode并未被通知,下面點擊Xcode>Quit Xcode,然后重新啟動它,在NoGitExample項目中,如果你再次打開Source Control菜單,你會發現所有的選項已經被使能了,就像一開始勾選上創建git源一樣。

現在這個項目的使命已經結束,你可以在桌面上刪除它。


現在你知道如何為你所有的項目添加git源了,即使你在創建時沒有添加,你也可以在以后任何時候為它手動添加源。

提交更改(Committing Changes)
提交更改指的是儲存一個包含所有更改的新版本。一般來說,當我們做了一些有意義的工作,并且項目處于某一個穩定狀態時,就可以提交一次更改。然而具體什么時候提交更改并沒有硬性的規定。我的建議是:從上次提交更改之后,如果你怕花費大量時間和精力做的新工作被誤刪很難恢復,你就需要提交更改了。

默認情況下,Xcode在項目創建之初會提交一次更改,這是為了保存項目初始狀態。這項工作會在后臺完成,不會打擾你或者要求你進行確認。如果你在項目創建時沒有添加git源,但是之后你手動添加了,你可以通過我們先前使用過的命令來進行提交:git commit -m ‘Initial commit’


實際上,你如果去Source Control>History…菜單,你就會看到初次提交更改的記錄,以后每次提交更改,都會在這里有所記錄。

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

  1. @interface?ViewController?() ?
  2. ?
  3. @property?(nonatomic)?int?sum; ?
  4. ?
  5. @end??

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

  1. -?(void)didReceiveMemoryWarning ?
  2. { ?
  3. ????[super?didReceiveMemoryWarning]; ?
  4. ????//?Dispose?of?any?resources?that?can?be?recreated. ?
  5. ?
  6. ????int?a?=?5; ?
  7. ????int?b?=?10; ?
  8. ?
  9. ????self.sum?=?a?+?b; ?
  10. ?
  11. ????NSLog("The?result?is:?%d",?self.sum); ?
  12. }??

看一下Project navigator面板,你會發現在ViewController.m文件旁邊,添加了一個M字母,像下面這樣:

這意味著那個文件已經被修改,相比上一次提交更改,文件有所改變。一般來說,你每次改變文件,都會出現這個M字母,提醒你有未提交的更改。

?

下面看看如何提交更改,其實非常簡單,只需要打開Source Control>Commit菜單,下面窗口就會出現:

讓我們一步步看看它告訴我們了什么。在左邊(標1的區域),列出了所有被更改的文件,在這個例子中,只有ViewController.m這個文件被改變,因此列表中只有它被顯示。如果你仔細觀察,你會發現文件左邊有一個選擇框,默認情況下是被選中的,如果你取消它,這個文件的更改就不會被提交。

?

在窗口的中間區域,有兩個預覽窗口,左邊那個是文件當前版本,右邊是文件上一次提交更改的版本。因為我們目前只是創建時提交過一次更改,因此右邊顯示的是文件的初始狀態。


左邊窗口藍色區域標出的就是更改的內容,這樣的表示讓我們可以清楚地看出所有的修改。如果你仔細看,會發現在兩個窗口之間還有一個帶數字的小標簽,這個數字一一表示了各項更改。在數字旁邊,默認情況下有一個小對勾,表示本更改會被提交,如果你點擊右邊的小箭頭,會彈出一個選項菜單,你可以選擇不提交這個更改或是忽略它。


?

如果你選擇了Don’t Commit這個選項,小對勾就會被一個停止標志取代,這項更改就不會被保存到源中。

?

如果你選擇了Discard Change這個選項,會彈出一個確認窗口,提示你所做的更改會被恢復,并且無法取消這個操作。

如果你點擊了OK按鈕,所選區域的改變就會消失,就像他們從未出現過一樣。

?

如果你仔細觀察上面這個提交窗口,你會看到你所做的所有修改都會被Xcode看做改變,即使是一個空行。實際上空行相當于回車,在屏幕上是不可見的,因此作為改變也是理所當然的。

?

在本例子中,你不用忽略任何修改,而是允許提交所有更改,因此所有的改變標簽旁邊必須都是小對勾。

?

在兩個窗口下面是一個空白的區域,中間顯示了提交更改的信息。這個地方可以添加一些關于此次更改的簡短描述,點擊它,加入如下內容:

書寫有意義的提交信息非常有用,尤其是當你頻繁提交的時候。因此,把它當做一個必要的步驟。

?

現在這個窗口的基本信息看的差不多了,是時候做我們第一次的提交了。在這個窗口的右下腳,有一個按鈕上面寫著:Commit 1 file。

這個按鈕會顯示需要提交的文件總數。點擊它之后你的第一次提交就完成了!打開Source control > History,你會發現它會被顯示在列表中。

從上圖中可以看出,我們編寫的信息以及更改的文件數量會被顯示出來。Xcode執行初始提交,所有文件都會被提交一下,而這次只有我們修改的那個文件被提交。


另外,關閉歷史窗口,看一下Project Navigator,你會發現ViewController.m旁邊的M符號已經消失了。


現在,讓我們準備下一次提交。這次,我們給工程添加一些新的文件。添加文件最好的方式就是創建個新類,因此,按下Command+N組合鍵,添加一個Objective-C類。讓這個類繼承NSObject類,取名叫TestClass,然后添加到工程中。


完成之后,注意一下Project Navigator,你會發現兩個新的類文件旁邊有個A的字母標識,這意味著這些文件已經被添加到項目中,當然,他們還沒有被提交。


打開ViewController.h文件,導入我們的新類:

  1. #import?"TestClass.h"??

下一步,打開ViewController.m文件,像下面一樣聲明一個私有屬性:

  1. @interface?ViewController?() ?
  2. ?
  3. @property?(nonatomic)?int?sum; ?
  4. ?
  5. @property?(nonatomic,?strong)?TestClass?*testClass; ?
  6. ?
  7. @end??

看一下項目導航欄,這次有四個文件有待提交。讓我們打開Source Control > Commit菜單,將它們提交。

需要提交的一共有5個文件。除了之前修改的四個之外,還有一個項目配置文件。Xcode會在新類被添加到項目中之后自動修改這個文件。如果你你打開TestClass.h或TestClass.m文件,左邊的窗口沒有任何顯示,如下圖所示。

這是因為在這個文件在之前沒有被提交的記錄,因此沒有一個可以比較的版本,在右邊只顯示了File was added。


在消息區寫上這樣一個描述:TestClass was added to project.. 之后點擊Commit 5 files按鈕即可。


這樣第二次手動提交就成功了。你可以到Source Control > History 菜單查看提交的記錄。

版本之間的比較(Comparing Versions)
當你提交了同一工程的不同版本之后,在他們之間比較,追蹤修改信息就會非常方便。當新添加的代碼不能運行時,這時與之間版本進行比較就非常重要了,你可以看出新版本相比上個穩定版有了哪些更改。

?

要比較同一個文件的兩個版本,你可以使用View>Version Editor>Show version editor,或是點擊工具欄上的Version Editor按鈕:

點擊之后,編輯器會分為兩欄。最初,兩欄會顯示相同的內容,點擊編輯器下面的那個小時鐘圖標,可以選擇之前已經提交的版本進行比較。

點擊之后,兩個版本的區別會在編輯器中顯示出來。通常,左邊顯示的是當前版本的文件,右邊顯示的是之前的版本。藍色高亮的區域顯示了被更改的代碼,因此比較代碼的變化非常容易。繼續選擇任何此前的版本,并觀察兩欄的區別。

你可能會注意到,在兩個編輯器中間,還有在提交窗口看到的小標簽。點擊向下的按鈕可以跳出讓你忽略更改的選項。如果你點擊了忽略更改,Xcode會提示你是否同意。如果你同意忽略,這些被忽略的代碼將會永遠消失,無法再找回來。所以要注意不要無意中忽略任何代碼。
?

除了上面說到的方法,還有一種你回到之前版本的方法。如果你仔細觀察兩個編輯器下面的工具欄,在中間有個帶箭頭的時鐘圖標:

點擊它之后,兩個面板之間的縱列內容就發生了改變,變成了一系列表示之前更改的時間戳。注意并不是所有的都代表實際提交。代表先前版本的圓角矩形的數量取決于提交的次數。在這個例子中,只有兩個這樣的圖形,代表了兩次提交。

在這一列的下面,有兩個箭頭。左邊的那個屬于左邊的面板,右邊的箭頭屬于右邊的面板。將箭頭移動到任意之前的版本,你會看到在相應面板中的改變。如果你想比較當前版本和之前任意版本的區別,讓一個箭頭指向local行,然后移動第二個箭頭。時間戳從底部到頂部代表了從新到舊的代碼。在base行,你會看到上一次提交的內容。繼續向上移動,你會看到最初的提交,如下圖所示:

現在你知道如何比較版本之間的區別了。再繼續深入之前,把前面學習的練習一下玩玩吧。


究竟是誰的錯?(Who’s Got the Blame)
除了比較文件的版本外,Xcode還可以讓你追蹤文件的提交者,以及是誰改變了哪一部分代碼。在一個多人的團隊中,這非常有用。要使用這個功能,點擊View > Version Editor > Show Blame View菜單。或是講鼠標放在工具欄的Version editor 按鈕上,選擇Blame選項。一個與上面類似的窗口將會出現:

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

如果你還沒有做過,那自己動手打開這個blame視圖,注意一下Xcode展現代碼段作者的方式。在這個視圖中,可以方便地找到某一代碼在何時被誰提交以及其他你想要的信息。將鼠標放在blame面板上,將會顯示修改的一些其他信息。當指針停在提交段上時,一個帶圖片的小按鈕就會出現在它的右邊。點擊選中該段代碼,就會彈出一個附帶提交信息窗口。在這個窗口中,你還可以跳轉到比較窗口(indication #1),以及特定提交的修改文件(indication #2)。


?

除了比較視圖和blame試圖,其實還有一個日志視圖(Log view)。你可以通過View > Version Editor > Show Log View來打開它。或者如果你在這里就不在詳細說它了。你可以自己去看看,畢竟這個用起來也沒那么復雜。


分支(Branches)
試想一下,你現在的工程有一個即將發布的版本,或是已經發布的版本,你突然想添加一些新的特性,如何防止這些新添加的代碼讓整個項目陷入癱瘓呢?答案很簡單:你需要使用分支。


如何簡單的理解分支呢?你可以把你的項目想象成一棵樹,穩定版本就是樹的主干。任何添加新功能的版本都必須是樹干的一部分。分支,就像是樹的枝干,它從樹干生長出來,向不同的方向生長。在git中,你可以通過創建分支來為你的代碼設置一個新的路徑來實現新特性,而不用擔心在開發中破壞主干。

?

實際上,在git中默認都會有一個分支,叫做master。Xcode自動執行的第一次提交中就發生在這個分支中。通常,單獨的開發者只在master這個分支開發,這其實不是一個好習慣。無論你是單打獨斗還是組團合作,我認為在對項目作出重大改變或添加重大功能時,使用分支是十分重要的,它會為你避免很多麻煩。當然,在團隊項目中,為你自己負責部分的代碼搞一個分支幾乎是必須的。

關于分支,你必須記住以下兩點:
1.?提交到App Store或客戶的最終產品必須是項目中的master分支項目。
2.?任何在第二分支中實現的代碼或者功能最終都必須合并到master分支,這樣正式發布的應用程序才是完整的。(以后再講這一點)

?

當你開始一個新分支時,你實際上是以當前工作狀態作為起點,即使你有任何未提交的更改。從這個時候起,所有的改變都會只體現在分支中。

?

現在讓我們回到Xcode,要創建一個分支,點擊Source Control > GitDemo-master > New Brance…這個菜單,然后會彈出如下菜單:

為這個分支起一個名字,我就把它起名為AnotherBranch好了。現在你怎么給它起名其實都無所謂。點擊OK按鈕,等一下新的分支就會被創建,而當前的代碼也會復制到新分支中去。

?

打開Source Control菜單,你就可以輕松地找出活動分支是哪一個:它就在項目名字的旁邊。

現在,讓我們做一次新的分支的提交。在這之前,讓我們添加一些新的代碼。打開類文件,在私有屬性區添加以下方法聲明:

  1. @interface?ViewController?() ?
  2. ?
  3. ... ?
  4. ?
  5. -(void)sayHello; ?
  6. ?
  7. @end??

?然后實現它:

  1. -(void)sayHello{ ?
  2. ????NSLog("Hello"); ?
  3. }??

最后,在viewDidLoad中調用它:

  1. -?(void)didReceiveMemoryWarning ?
  2. { ?
  3. ????...???? ?
  4. ?
  5. ????[self?sayHello]; ?
  6. }??

現在,點擊Source Control > Commit菜單,版本比較窗口將會出現,你會看到只有一個被修改過的文件--ViewController.m文件,新添加的部分會被高亮顯示。


輸入下一個提交信息:First commit to a new branch,然后點擊commit 1 file按鈕。現在AnotherBrance分支的改變就會被提交了。

?

打開Version Editor(menu View > Version Editor > Show Version Editor),找到右邊編輯面板下面的工具欄,你會看到被選中的分支是AnotherBranch,點擊它,你會看到這個分支和master分支同時出現,從master分支中選擇任意版本,Xcode都會高亮顯示兩者之間的區別。通過這樣,你可以方便地跟蹤所有分支間代碼的改變。

最后,切換到另一個分支,或是master分支,你可以點擊Source Control > GitDemo –AnotherBranch > Switch to Branch…菜單。

從這個窗口你可以選擇想要跳轉的分支,在這里讓我們跳回master分支:

選擇它并點擊Switch按鈕,master分支就會成為當然活動分支。你會發現在AnotherBranch中做出的改變并沒有出現在master分支。很好,我們在管理工程推進的同時,卻沒有修改穩定版本。

?

合并分支(Merging Branches)
在分支中進行開發是一種好習慣,然而,如果代碼改變要體現在發行版中,那么分支就必須被合并到master分支中。這一節我們將會告訴你怎樣合并它們。在Xcode里,將兩個分支合并成一個非常簡單。


讓我們做一個小實驗來看看合并是怎樣工作的。首先,確保master分支是現在的活動分支。如果不是,趕緊改過來:Source Control > GitDemo – AnotherBranch > Switch To Branch… menu,并從展示窗口選擇master分支。

?

下一步,創建一個新的分支:Source Control > GitDemo – master > New Branch… menu,命名為LastBranch

先讓Xcode飛一會,然后,到ViewController.m文件中,再創建一個私有方法,首先聲明它:

  1. @interface?ViewController?() ?
  2. ?
  3. ... ?
  4. ?
  5. ?
  6. -(void)sayByeBye; ?
  7. ?
  8. @end??

然后實現它:

  1. -(void)sayByeBye{ ?
  2. ????NSLog("Bye?-?Bye"); ?
  3. }??

最后,在ViewDidLoad方法中調用它:

  1. -?(void)viewDidLoad ?
  2. { ?
  3. ????...???? ?
  4. ?
  5. ????[self?sayByeBye]; ?
  6. }??

在合并之前,先提交這些更改。使用Source Control > Commit菜單來執行提交。

終于還是來到這一步,關于把兩個不同的分支合并成一個,你有兩種選擇“
1.?從分支合并:與你選擇的分支相關的任何改變都會被合并到現在活動分支中。
2.?合并到分支:當前活動分支的任何改變都會被合并到你選擇的分支中。

?

這兩種方式你都可以在Source Control > GitDemo 菜單中找到。注意當你的活動分支是master分支時,第二個選項是不可選的。

?

假設一個開發者在Anotherbranch分支實現一個sayHello方法,另外一個開發者在LastBranch中創建實現了sayByeBye方法,現在你需要將兩個人的工作合并到下一個穩定版本中,想一想你需要怎么做?很簡單,按以下方法將改變從兩個分支中合并進來:

?

首先,確保當前活躍分支是master分支。

?

然后,打開Source Control > GitDemo – master > Merge From Branch…菜單,選擇AnotherBranch然后點擊Merge按鈕。

接下來會出現一個比較窗口,在里面你會看到合并之后代碼的更改,看一眼,感覺差不多了就再點擊Merge按鈕。

Xcode會詢問你是否保存項目的快照,點擊Enable按鈕。讓Xcode飛一會,然后就好啦。AnotherBranch里面添加的內容已經合并到master分支中。

?

使用同樣的方法來合并LastBranch。你會發現如果你不提交更改,Xcode不會讓你再次合并。于是,我們只好先提交一下。在比較窗口你會發現一個紅色的區域顯示合并之后的更改,而不是之前的藍色。這意味著分支中的代碼將會替換原先活動分支中的代碼。

你可以輕松地避免這種現象的發生。在編輯面板的下面有幾個小按鈕,你可以試試他們都有什么作用,我選了第一個,它的意思是master分支的代碼會被放在上面,另一個分支的代碼會跟在它后面。

處理接下來所有需要更改的代碼,不要有遺漏。完事后就點擊Merge按鈕。


恭喜你!你已經成功的學會從多個分支合并了代碼,類似的情形你也應該會了。

?

忽略更改(Discarding Changes)
放棄不想要的代碼更改功能非常有用,只需輕輕一點,自從上一次提交之后的更改都會被放棄。當你在開發過程中發現出了大亂子,你想從上一個穩定狀態重新開始時,這個功能就派上用場啦。注意放棄更改這個功能沒有回頭路,點完之后你就沒有辦法再撤銷這個操作,所以,要小心使用啊!

?

之前,當我們在討論版本比較時,我們學會了如何忽略某一部分更改的方法,下面,我們要學一下如何一下忽略自從上一次提交之后的所有更改。

?

為了測試這個功能,首先寫一些代碼打開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. }??

如果你注意到Project Navigator,我們剛剛更改的文件旁邊有了一個M標識,很好,我們想看看如果忽略這些更改,這些文件是否會回到更改之前的狀態。

?

這里有一個重要的細節:你可以選擇忽略所有文件的更改,也可以選擇忽略單個文件的更改,這完全取決于你。如果你想忽略一個文件的更改,首先選定這個文件。在這個例子里,如果你只選擇ViewController.m文件然后打開Source Control菜單,你會在ViewController.m中發現Didcard Changes這個選項。類似的,如果你只選擇ViewController.h也是一個道理。然而,如果你想忽視這兩個文件的更改(這里假定有兩個以上的更改),就在Project Navigator中選中它們,然后再打開Source Control菜單。相應的位置就會顯示Discard Changes in 2 Files,像下面這樣:

然而,這次我們不會使用這個按鈕,我們要用Discard All Changes。點擊它之后,一個確定提示框就會出現,這是這部分Xcode防止你誤刪代碼的唯一措施。

點擊Discard All Changes, 那你剛才寫的那個公共方法就永遠屬于過去了。看到了吧,只需幾步就可以讓你從當前工作狀態恢復到之前的提交,所以我再一次提醒你要在使用Source Control 中小心點,別誤點了這個按鈕。

?

總結
通過這篇教程,我盡力詳述了在Xcode中進行版本控制的方法。其實在幕后,真正起作用的是git----地球上應用最多的版本控制系統。你可能注意到我在教程中并沒有過多的提到GitHub或者任何Xcode的一些功能----其實我是故意這樣的。我想把注意力集中在使用Xcode進行git管理的內容上。只有當你懂得了如何進行版本控制之后,才能真正的使用GitHub。我想再重申一下,如果你是一個團隊在工作,使用版本控制工具是必須的!如果你是單打獨斗,使用版本控制工具也是很有必要的,它可以為你花大量時間和精力所做的工作提供保障,并且在你添加新功能時可簡單地進行擴展。這個工具就像有些人說的那樣,一旦用了,就再也回不去了!最后,我希望這個教程會對你有用。

轉載于:https://www.cnblogs.com/moxuexiaotong/p/4981204.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258067.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258067.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258067.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

matlab做比例積分微分控制,收放卷卷徑計算+閉環擺桿控制參數自適應PID控制算法(變比例變積分變微分)介紹...

項目簡介最近在一個客戶現場搞熔邊機項目,涉及到收放卷工藝的卷徑計算,同時張力控制使用的是擺桿,然后通過PID控制輸出輔助轉速補償收卷伺服速度。單一的PID參數不能自動適應卷徑變化,如在小卷徑200mm下調試整定出的一組PID參數,當…

如何檢測支付寶接口中notify_url.php有沒有返回,支付寶中的手機網站支付接口,php版 notify_url.php 異步通知頁面未成功執行...

require_once("alipay.config.php");require_once("lib/alipay_notify.class.php");$alipayNotify new AlipayNotify($alipay_config);$verify_result $alipayNotify->verifyNotify();if($verify_result) {//驗證成功$notify_data $alipayNotify->…

openfire學習4---android客戶端聊天開發之聊天功能開發

前面我們已經把服務器搭建完成,并且在客戶端實現了登錄了。 和我們使用的QQ一樣,想一想,登錄成功之后呢?肯定是要有一個好友列表,通過這個列表,我們可以選擇我們需要聊天的好友。 這里我們先研究下 xmpp的數…

運用runtime與AOP實現oc中的kvo

前言: oc中實現的kvo觀察者模式比較呆板,不支持block,運用runtime機制將其進行實現。 詳細實現步驟: 一:給NSObject添加分類(添加相應的添加觀察者,刪除觀察者的方法),這樣凡是繼承NSObject的類生成的對象都會擁有這兩個方法。 二:在添加觀察者的方法中,檢查本類是否…

CentOS下IPTABLES配置詳解

iptables是與Linux內核集成的IP信息包過濾系統,其自帶防火墻功能,我們在配置完服務器的角色功能后,需要修改iptables的配置。配置CentOS和Ubuntu等linux服務器時需要對服務器的iptables進行配置,以下是iptables常見的幾種配置方法…

mysql教程詳解之多表聯合查詢,MYSQL教程mysql多表聯合查詢返回一張表的內容實現代碼...

搜索熱詞《MysqL教程MysqL多表聯合查詢返回一張表的內容實現代碼》要點:本文介紹了MysqL教程MysqL多表聯合查詢返回一張表的內容實現代碼,希望對您有用。如果有疑問,可以聯系我們。今天在使用MysqL語句的時候老是報錯,語句如下:sq…

C#實現冒泡排序

一、算法原理 1、比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。 2、對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。在這一點,最后的元素應該會是最大的數。 3、針對所有的元素重復以上的步驟,除了最后一…

PHP - 使用 Pear 進行安裝和卸載包

安裝: 首先運行到php根目錄: 輸入要安裝的包文件名: 使用語法: pear install 要安裝包的名稱 回車確認: 如果沒有其他意外,顯示安裝成功。查看安裝的包的信息: 語句: pear info 包的…

CYQ.Data 輕量數據層之路 V2.0 震撼驚世 支持多數據庫/內置Aop(二十五)

所有文章索引:CYQ.Data 輕量數據層之路 框架開源系列 索引 前言: 從V1.5發布到現在時隔20天了,終于發布2.0版本了,2.0系列版本由于引入多數據庫支持,內部結構改動較大。 但是外面調用方式仍保持一致向下兼容&#xff0…

matlab 捕食者和獵物,MATLAB - 追求曲線(捕食者/獵物)

在我的工程課上,我們編寫了一個“非平凡的”捕食者/獵物追捕問題。以下是情況的要點:有一個獵物試圖逃脫捕食者。每個都可以建模為可以在MATLAB中制作動畫的粒子(我們必須使用這種編碼語言)。獵物:可以比捕食者更容易操縱(轉彎)捕食者&#x…

SQL Server 2012安裝圖解

方法/步驟 在資源管理器中雙擊SQL Server 2012的安裝光盤,此時會出現一個安裝窗口,在左側的界面中點擊“安裝”選項卡,如圖所示。然后點擊右邊的第一項“全新SQL Server 獨立安裝...”選項。 點擊“下一步”按鈕繼續下一步安裝。耐心等待片刻…

C#中讀寫INI文件

INI文件就是擴展名為“ini”的文件。在Windows系統中,INI文件是很多,最重要的就是“System.ini”、“System32.ini”和“Win.ini”。該文件主要存放用戶所做的選擇以及系統的各種參數。用戶可以通過修改INI文件,來改變應用程序和系統的很多配…

html5響應式設置meta

1 <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <!--放大頁面到設備合適的分辨率--> 若不支持&#xff0c;請使用兼容ie的js 1 <!--[if lt IE 9]> 2 <script src"http://css3-mediaqueries-js.goo…

jmap在ubuntu上DebuggerException: Can't attach to the process

解決&#xff1a; 臨時&#xff1a; 1.echo 0 >/proc/sys/kernel/yama/ptrace_scope 永久&#xff1a; 2.修改 /etc/sysctl.d/10-ptrace.conf&#xff0c;設置kernel.yama.ptrace_scope0 參考&#xff1a;http://bugs.java.com/bugdatabase/view_bug.do?bug_id7050524轉載于…

C/C++中對鏈表操作的理解實例分析

鏈表概述   鏈表是一種常見的重要的數據結構。它是動態地進行存儲分配的一種結構。它可以根據需要開辟內存單元。鏈表有一個“頭指針”變量&#xff0c;以head表示&#xff0c;它存放一個地址。該地址指向一個元素。鏈表中每一個元素稱為“結點”&#xff0c;每個結點都應包括…

idea寫java spark程序,Spark : 在IDEA中用scala編寫Spark的WordCount程序并提交運行

使用IDEA新建maven工程&#xff0c;添加相關依賴&#xff1a;1.81.82.11.112.3.02.7.7utf-8org.scala-langscala-library${scala.version}org.apache.sparkspark-core_2.11${spark.version}org.apache.hadoophadoop-client2.7.7給項目添加scala支持&#xff0c;新建Scala Objec…

Contest - 2014 SWJTU ACM 手速測試賽(2014.10.31)

題目列表&#xff1a; 2146 Problem A【手速】闊綽的Dim2147 Problem B【手速】頹廢的Dim2148 Problem C【手速】我的滑板鞋2149 Problem D【手速】潦倒的Dim2150 Problem E【手速】被NTR的Dim2146 Problem A&#xff1a; 簡單的最長回文串統計算法&#xff0c;這里沒有過高要求…

利用Vagrant and VirtualBox搭建core os環境

利用Vagrant and VirtualBox搭建core os環境 系統環境 ubuntu 14.04 x64vagrant 1.7.4virtualbox 4.3.10git 1.9.1# 安裝 virtualbox, git sudo apt-get install virtualbox, git# 軟件中心的vagrant版本太低,因此去官網獲取最新的軟件包地址 wget https://releases.hashicorp.…

php關注 取消關注事件,微信公眾平臺開發關注/取消關注事件例子

用戶在關注與取消關注公眾號時&#xff0c;微信會把這個事件推送到開發者填寫的URL。方便開發者給用戶下發歡迎消息或者做帳號的解綁下面是一個微信公眾平臺關注和取消關注的實例:responseMsg();} else {$wechatObj->valid();}class wechatCallbackapiTest {public function…

DFS應用——遍歷有向圖+判斷有向圖是否有圈

【0】README 0.1&#xff09; 本文總結于 數據結構與算法分析&#xff0c; 源代碼均為原創&#xff0c; 旨在 理解 “DFS應用——遍歷有向圖判斷有向圖是否有圈” 的idea 并用源代碼加以實現 &#xff1b;0.2&#xff09; 判斷有向圖是否有圈的rule—— 一個有向圖是無圈圖當且…