这是一篇翻译作品,怎样在Xcode 8上使用Git实现源码控制
文章原文地址:How To Use Git Source Control with Xcode 8
英文水平有限,错误之处希望各位海涵!最好还是看原文, 下面开始正文。
Update:Updated for Xcode 8 by Richard Critz. Original tutorial by Malek Trablesi and previously updated by Felipe Laso-Marsetti.
不管你是独自开发人员或工作在一个团队,如果你不使用源代码控制你的项目,你应该使用。源码控制是惊人的,因为它可以帮助你更容易地恢复到旧版本的代码,没有风险的添加新功能到你的程序,查看你的代码随着时间的推移而改变,或者作为一个团队工作。最好的一个源代码控制系统建立在Xcode - Git !Git是一个分布式的版本控制系统最初由Linus Torvalds,Linux内核的发展背后的主要力量。Git的好处是不需要有任何中央存储库——每个人都可以有他或她自己的可视代码,更新其他来源的代码修改。在本教程中,您将得到可靠的经验与Git和直接在Xcode中学习如何使用它。
开始Gitting
你会马上开始尝试,而非漫游在Git的理论中,您将创建一个新的Xcode项目,尝试一些你通常会做日常任务使用Git源代码控制。
打开Xcode,创建一个新的单一视图应用程序项目。
填写模板选项如下:
- Product Name: GitUseExample
- Team: Your Apple Developer team if you have one, or None
- Organization Name: Your name
- Organization identifier: As the name indicates, it’s your organization’s identifier, if you have one. - Otherwise, type whatever.
- Language: Swift
- Device family: iPhone
- Use Core Data, Include Unit Tests, and Include UI Tests: not checked
单击Next。以下对话框允许您选择保存您的项目。在MAC上选择创建git存储库的位置。之后单击Create。
注意:如果您没有看到的复选框,可以单击选项按钮。
Xcode将创建一个新项目以及新的Git存储库。
所有的源代码控制系统,包括Git,将它们的数据存储到存储库,这样他们就可以管理你的项目版本和跟踪整个开发周期的变化。将存储库作为版本的数据库。
在你的开发项目的过程中,您将添加文件,修改代码,多次改变项目。当你做了一系列的改变,你的项目处于一个“known good”状态(通常是每天一次或多次),这是一个好主意,检查您在存储库中的更改。这给了你一个“known good”状态的记录,你可以随时得到反馈。但是,由项目模板创建的代码呢?你的项目还只包含模板文件。还没有任何的提交是因为Xcode在你创建的时候已经帮你做好了。:]
查看一下,从菜单中选择 Source Control\History…
在下拉菜单中,请注意有一个提交以及一些相关信息,包括提交标识符,日期和时间,提交人,改变的文件和提交信息。
注意:通常情况下,你可以点击"Show modified files"按钮能看到提交内容的更多信息。不幸的是,由于在Xcode中有个bug,这只是工作一段时间。您将学习一种不同的,浏览下面更可靠的方法的一些信息。
现在,对您的项目做一些改变。打开AppDelegate文件改变应用程序application(_:didFinishLaunchingWithOptions:)如下:
funcapplication(_ application:UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplicationLaunchOptionsKey:Any]?)->Bool{print("Application did finish launching")returntrue}
保存文件后,您会注意到,AppDelegate.swift文件名后面有一个“M”标识。
“M”标识代表”modified“。意味着你已经修改了文件,但尚未提交到本地Git存储库。
接下来,打开ViewController.swift并添加之后添加以下代码在viewDidLoad():之后
@IBActionfuncbuttonClicked(_ sender:UIButton){
print("This is a Git tutorial")
}
现在,打开Main.storyboard并从对象库拖拽一个按钮到屏幕。随意改变按钮的显示文本如下面屏幕截图所示。
要做的最后一件事就是连接动作和按钮。单击黄色图标视图控制器的视图控制器的事件。从连接检查区(右边最后一个选项卡栏),点击旁边的圆圈buttonClicked:在接收到的操作面板,并将其拖动到按钮在故事板编辑器。从弹出菜单中选择Touch Up Inside。
如果你检查项目导航器,您将注意到所有你修改过的三个文件都有一个“M”标识。
编译并运行,确保项目正常工作。单击按钮可以看到控制台输出“This is a Git tutorial“。
w00t——现在你的代码在一个“known good”状态!可以提交了。
做一些提交--配置
提交文件是很容易的!从菜单中选择Source Control\Commit…
将显示一个新窗口,类似于以下图片:
正如您可以看到的,屏幕分为两个分区。左窗格显示当前状态中的文件,以及上次提交后所做的所有更改。由于这是您的第一次提交,您可以看到自项目创建以来所做的所有更改。
右边显示文件之前的更改。
仔细地观察本次Xcode提交窗口
左侧面板(1)显示在您的项目未提交的所有文件的更改。默认情况下,Xcode假设在本次提交中你想包含所有的文件。如果你不想在本次提交中提交某个文件,取消选中它。正如您将看到的,在这次提交中你也可以决定包含哪些个别部分。
请注意代码中蓝色高亮部分。这些表明你已经改变的部分。任何改变,即使它只添加或删除空格,都会以蓝色高亮的部分跟踪并标记出。
自己尝试一下。点击"Cancel"按钮,打开ViewController.swift,在文件的末尾添加一新行。现在选择Source Control\Commit…。结果应该类似如下:
正如您所看到的,Git仔细跟踪您在开发过程中所做的每一个更改。
在该地区的两分区之间,你所有的变化都会标记在Xcode上(标记为“2”上面)
每一个变化是默认被选中。在提交中取消选中可以排除特定的更改。
例如,更改3是不重要的,因为它只包含前面添加的空行。取消选中,这个更改不会被提交。
另一种排除个别变化的方法是单击数字后面的小三角。会出现两个选项:Don’t Commit(或Commit如果改变没有选中)和Discard Change。在这种情况下,选择Don’t Commit。
你完成提交之前,Xcode需要你在屏幕的下方输入提交信息.这个信息帮助你更好的理解每次提交的内容.
现在点击Commit 4 Files,恭喜你完成了第一次的提交,如果你返回历史记录,你可以在日志中看到新的提交.
这个简单的改变和提交的过程 就是你90%的时间所做的事情。相当简单,对吧!现在你没有理由不这么做吧!:]
注意:眼尖的读者可以注意到"我只改变了3个文件.为什么我提交了4个文件?" Git记录每一个文件在你的项目目录包括所有Xcode后台操作的文件。通常情况下,这么做可以准确的完成你想要的操作。稍后您将看到如何在需要的时候改变这一行为。
分支
Git支持Xcode的另一个特点是能够提交您的更改到一个特定的分支。但是等等,什么是分支?
分支是保持一组提交在一起的方法。通过在不同的分支上工作,你可以保持特征分离,减少你完全破坏你的项目的风险。
信不信由你,你已经在使用分支了。当第一个库被创建时,Git也在该库中创建一个名为“master”的分支。到目前为止,你所有的工作都在主分支。
主分支应始终保留项目的主要副本。您使用其他分支作为一种方法来存储正在进行中并尚未发布的代码。您还可以使用它们来做可能永远不会发布实验存储。
例如,你在你的APP中准备添加一个新的地图功能,但它并没有为生产做好准备。
为了进行模拟,创建一个新的派生类继承自NSObject并命名mapforitinerary。你的项目可能看起来像这样:
新文件MapForItinerary.swift文件名后面显示标识"A",表明这是一个没有提交到数据库的新文件。
从菜单中选择Source Control\Commit…
如果你选择一个显示状态为"A"的文件,可以看出Xcode不能提供任何早期的版本与其对比。这是因为这个文件之前没有被提交到存储库,所以没有可比较的内容。
添加地图功能到您的应用程序代表在您的代码中有一个大的改变。这完全符合使用分支的情况。这将有助于隔离风险,以防新的地图代码中有什么问题。
单击“Cancel”代替“Commit 3 Files”按钮。从菜单中选择Source Control\GitUseExample\New Branch…注意菜单中当前的分支-master
Xcode询问你给新分支命名
分支命名map_feature,之后点击Create。
Xcode创建新分支,切换到它。您可以通过打开源代码管理菜单来验证这一点。
选择Source Control\Commit…,输入提交信息,选中Commit 3 Files.
请注意,在项目导航器中的文件旁边的所有状态字母已被清除。这意味着您不再有任何未提交的更改。
观察你的分支,从菜单中选择Source Control\GitUseExample\Configure GitUseExample…
在结果区中中选择Branches选项。
回退
你正在你项目的最新版本上工作,实现最新的有趣的功能。你休息一下,吃点点心,然后突然灵机一动,找到一种更好的方法来实现它。在这一点上,您可能希望从源代码管理恢复最后一次修订,并重新开始。
Git轻松地做到了这一点!:]
打开Main.storyboard,并且从对象库中拖拽一个新的视图控制器到画布上。
打开MapForItinerary.swift文件并且添加方法sayHello().
classMapForItinerary:NSObject{funcsayHello(){print("Hello from MapForItinerary")}}
注意,修改的文件的状态已经改变为“M”,这意味着文件本地修改和等待上传。
在这一点上,你可以选择性的丢弃更改你的项目。选择Main.storyboard在项目导航栏,然后选择菜单Source Control\Discard Changes in “Main.storyboard”…
Xcode将提示您确认你真的想放弃所有更改的文件。
点击"Discard Changes".您应该看到视图控制器(和黄色警告图标)你刚才添加的消失了!这对修改出现问题的代码非常有用,你想回到上一个正常工作的代码版本。
除了丢弃整个文件的更改,你也可以丢弃局部的更改。
MapForItinerary.swift仍有"M"标识。选择菜单Source Control\Commit… 单击旁边有向下箭头更改数字并选择Discard Change:
哇! 改变完成。左侧没有什么东西可提交,选择"Cancel"关闭提交窗口。
既然你已经尝试了丢弃更改,你可能会想这和早些时候你选择不提交选项之间的区别是什么。
虽然这两个选项都会导致存储库中没有记录更改,但确实存在很大的差异:
· Don’t Commit 让代码跳过提交,但它仍然在本地源代码中。
· Discard Changes 不仅跳过更改,而且会把它从本地源代码中删除。
时间旅行
丢弃更改是一个很好的方法来恢复正常工作代码并且节省您的时间。然而,在某些情况下它可能有些局限。
Git允许您保存项目的多个修订版本,其中每个修订版本都有特定的更改。这些都存储到由Git管理的存储库中
如果选择丢弃对文件的更改,Git将恢复文件到上一个提交版本,并且只保留最后一个。
那就是局限所在。
随着时间的推移,您的项目库将包含反映您开发历史的多次修订。假设您希望还原到特定文件的第一个或第二个版本。没有其他办法,只是通过丢弃更改。不要失望,无论如何,Xcode和Git很容易做到。
在项目导航栏中选择ViewController.swift文件,然后选择菜单View\Version Editor\Show Comparison View 或者你也可以点击第三个按钮在编辑部在Xcode窗口右上方的工具栏。
版本编辑器分为两个区域,如下所示:
这允许您比较选定文件的两个修改版本,并与提交窗口中的比较视图完全一致。
默认情况下,您当前的源文件显示在左边,而最近的修订存储在存储库- Git调用这个HEAD-显示在右边。
若要从存储库中显示早期版本,请单击右窗格底部的时钟图标(红色下方标记),然后选择较早的修订版本
选择更改之前的版本如下图所示。你看到的确切信息将不同于截图。
现在,回退文件版本,只需单击比较区域箭头旁边的更改号码,选择丢弃更改。很容易吧!:]
一旦你恢复到早期版本,你将需要提交这个“new”版本的文件作为最新的。现在就去做。
你怎么知道哪一个早期的提交是你想要的?虽然你可以使用你先前学到的历史命令,但有一个更好的方法。单击并按住“Version Editor”按钮并选择Log。还可以从菜单中选择“View\Version Editor\Show Log View”.
Xcode以列表的形式包含当前文件的提交更改。列表中每个提交包含提交标识符。
这些标识符匹配你早期版本的更改记录列表。
还可以单击“Show modified files”以更详细地查看代码变化,试一下吧!
另一个在项目中有用的功能被称为Blame View--责任区,这个功能可以查看项目文件中每一行代码都是谁提交的。
切换责任区,点击"Version Editor"按钮,然后选择"Blame",你也可以选择菜单"View\Version Editor\Show Blame View"
你的屏幕看起来像这样:
要查看有关更改的详细信息,请按日期旁边的“i”按钮。会弹出包含提交人,提交信息,提交标识符的弹出框。它也有一个按钮来显示在提交中修改的所有文件,还有一个打开当前文件的比较视图的按钮,将本次提交与之前的提交进行比较。
合并分支
你已经知道Git允许你在多个被称为分支的修改流上工作。您还了解到,在主分支以外的分支上完成所有的开发是很好的做法。
那么,当你完成一个功能的开发并想发布它时,你会做什么?简单的!将开发分支合并到主分支中。
您的新地图功能尚未完成,但你们的设计师要求在主界面上添加另一个标签。为了实现这一点,你将需要离开"map_feature"分支,从状态为"known good"的主分支上创建一个新的分支。
从菜单中选择Source Control\GitUseExample\Switch to Branch…
从可用分支的列表,选择"master"然后点击"Switch"
重要的是要确保你从正确的“known good”状态开始你的新分支。
接下来选择Source Control\GitUseExample\New Branch…
命名为new_label并点击创建
为了验证你是在"new_label"分支上工作的,点击"Source Control",查看工作副本的名字。
现在可以添加你的设计师要求添加新的标签了。
切换回标准编辑器视图,选择Main.storyboard文件,并在主视图上拖拽一个UILabel
构建和运行,以确保一切正常,然后提交您的更改到资源库中。一定要添加一个提交消息。
现在切换到主分支,再次运行应用程序。正如预期的那样,你新加入的UILabelb不在这个分支。最后的工作是将新分支合并到主分支上。
从菜单中选择Source Control\GitUseExample\Merge from Branch…
从可用的分支列表中,选择new_label,然后点击Merge.
将出现合并窗口,允许您控制合并过程。合并源(“从”合并的分支)将出现在右边。您的当前源,如由合并修改的,将出现在左侧。使用屏幕底部的按钮来控制合并的方向。就像这样一个简单的合并,Xcode的默认设置是正确的。
最后,单击Merge按钮开始合并
如果一切顺利的话,你应该看到变化(UILabel)从新的分支出现在用户界面,当你选择main.storyboard或当你运行你的应用程序。现在您的更改已经合并到主分支!使用一个方法查看您的提交历史,您学会验证此更改出现在历史记录中。
忽略生成的文件
回到第一次的提交你可以看到,除了你的源文件,Git记录Xcode管理的文件版本,这很重要,因为这些文件与你的源文件一样是你的项目所必需的。你需要它们重建你的应用程序或与他人合作。
然而.作为它的工作,对于每次版本的构建,Xcode也会生成其他的文件.保存这些Xcode自动生成的文件是不重要的.实际上,保存它们会导致Git做不必要的工作,并使您更难在提交记录中发现重大变化。
Git提供了一种机制,忽略这些文件:适当命名的 .gitignore文件。在其命名规则初期MacOS视它为隐藏文件,当你通过Xcode或者Finder查看你的项目时是看不到的.但是,不要担心,Git会发现并正常使用它.
与其自己做 .gitignore文件,还不如从gitignore.io下载
首先,打开一个终端窗口并输入以下命令。你只需要做一次,而不是每一个项目都做一次。
$ git config --global alias.ignore '!gi() { curl -L -s https://www.gitignore.io/api/$@ ;}; gi'
现在,为任何一个项目使用Git,使用下面的命令行:
cd <directory where your project is stored>
git ignore swift,macos >.gitignore
git ignore swift,macos >.gitignore
git commit -m "Add .gitignore file"
下载最新的 .gitignore配置文件,在macOS用swift写代码. 您的终端会话应该看起来类似:
注意为你存储库添加的.gitignore文件用Git记录,因为它提供的过滤也是你的项目的重要组成部分。
Xcode and GitHub
到目前为止,您所做的所有工作都使用了您的计算机上保存的本地存储库。GitHub网站允许你发布你的项目到一个远程存储库保存在Github服务器。这样很方便,因为它允许您轻松地与他人共享您的代码和工作作为一个项目组。
如果你没有一个Github帐号,去GitHub申请一个吧。
然后,创建GitHub上的项目库,点击GitHub网站的右上角的"+"按钮,选择New repository.
GitHub将呈出现如下界面:
填写仓库名称并点击Create repository.GitHub将创造你的存储库并进入快速设置界面。您需要保存您的库的HTTPS网址到剪贴板。确保HTTPS按钮被选中,然后单击剪贴板图标。
选择Xcode的菜单栏Source Control\GitUseExample\Configure GitUseExample…,选择Remotes选项,点击"+"按钮,然后选择Add Remote….
远程的名称将默认为“origin”.粘贴你的GitHub HTTPS字符串地址。点击Add Remote.
最后,点击"Done".你已经准备好发布你项目到GitHub上!
选择菜单栏Source Control\Push… Xcode会提示你远程的名字和分支。由于只有一个远程配置,会是默认配置。
点击"Push",Xcode将提示您重新登录。
输入账户并点击"OK".
Xcode会把你的账户保存在macOS的钥匙串里.你可以在Xcode Preferences里的Accounts选项管理他们.稍等一会,Xcode就是推送成功.检查你的GitHub页面验证您的文件存在。
Note:If you have set up your SSH credentials on GitHub (seeGitHub SSH Instructions), Xcode supports using SSH to connect to GitHub. Just use the SSH connection information instead of the HTTPS string when adding your remote.
现在是时候对你的项目做最后的修改了。打开ViewController.swift并改变buttonClicked()方法
@IBActionfuncbuttonClicked(_ sender:UIButton){print("You finished!")}
选择菜单栏 Source Control\Commit… 输入提交信息并选中左下角的Push to remote:选择框,因为你只有一个远程配置,默认将是正确的。
选择Commit 1 File and Push.等一会,Xcode会完成提交.在你的GitHub页面寻找你的新提交的内容。
成功! :]
最后说一句.能力一般,水平有限,欢迎指正,有问题可以发邮件到1432103394@qq.com