这是一篇翻译作品,怎样在Xcode 8上使用Git实现源码控制
英文水平有限,错误之处希望各位海涵!最好还是看原文, 下面开始正文。
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会发现并正常使用它.
首先,打开一个终端窗口并输入以下命令。你只需要做一次,而不是每一个项目都做一次。
现在,为任何一个项目使用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网站的右上角的"+"按钮,选择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页面验证您的文件存在。
现在是时候对你的项目做最后的修改了。打开ViewController.swift并改变buttonClicked()方法
@IBActionfuncbuttonClicked(_ sender:UIButton){print("You finished!")}
选择菜单栏 Source Control\Commit… 输入提交信息并选中左下角的Push to remote:选择框,因为你只有一个远程配置,默认将是正确的。
选择Commit 1 File and Push.等一会,Xcode会完成提交.在你的GitHub页面寻找你的新提交的内容。
成功! :]