对于实际的应用,应该尽早将其纳入版本控制下。版本控制是获取项目周期性快照的一种方式。其目的是:
安全
版本控制可以帮助你将提交存储到仓库中,这样代码就不会因为计算机故障或其他原因丢失了。
协作
版本控制支持多人开发,让大家合理地访问相同的代码。
放心
项目是个复杂的事物;有时需要做一些试验性质的修改,这可能涉及很多文件,可能经过很多天,然后才能测试新的特性。借助版本控制,如果出问题了,我可以轻松追踪每一步操作(之前的提交);这样我就有信心做一些经过一段时间才能看到结果的试验。此外,如果被一些试验搞乱了,我可以通过版本控制系统列出最近做出的所有变更。如果出现了Bug,我可以通过版本控制系统查明何时出现的Bug并探查原因。
Xcode提供了各种版本控制设施,主要面向Git(http://git-scm.com)与Subversion(http://subversion.apache.org,也叫作svn)。但这并不表示你无法在项目中使用其他版本控制系统;这只意味着你无法在Xcode中以集成的方式使用其他版本控制系统。没关系;还有很多其他方式可以使用版本控制,甚至是Git与Subversion。我们可以不使用Xcode的集成版本控制,转而使用Terminal命令行,或使用专门的第三方GUI前端,比如,面向Subversion的svnX(http://www.lachoseinteractive.net/en/products),或面向Git的SourceTree(http://www.sourcetreeapp.com)。
如果不想使用Xcode的集成版本控制,那么你可以将其关闭。如果未勾选Source Control首选项窗格中的Enable Source Control,那么你只能从Source Control菜单中选择Check Out,从远程服务器获取代码。如果勾选了Enable Source Control,那么还有3个复选框可以使用,它们决定了你想要哪一种自动行为。从个人角度来说,我喜欢勾选Enable Source Control与“Refresh local status automatically”,这样Xcode会在项目导航器中显示出文件的状态;剩下的两个复选框我没有勾选,这是因为我喜欢自己控制。
在新建项目时,Save对话框中有一个复选框,可以在一开始就在项目目录中创建一个Git仓库。这个仓库可以在自己的计算机上,也可以选择远程服务器。如果没有特别的原因,建议勾选这个复选框!
当打开已有的项目时,如果项目已经由Subversion或Git管理,那么Xcode会检测到这一点,并且会立刻在界面上显示出版本控制信息。如果使用的是远程仓库,那么Xcode会自动在Accounts首选项窗格中输入信息,这个窗格是仓库管理的统一界面。要想使用远程服务器,但又没有工作副本,那么请在Accounts首选项窗格中手工输入信息。
可以在两个地方使用源控制动作:Source Control菜单与项目导航器中的上下文菜单。要想检出并打开存储在远程服务器上的项目,请选择Source Control→Check Out。Source Control中的其他项都是显而易见的,如Commit、Push、Pull(或Update)、Refresh Status及Discard Changes。值得注意的是Source Control菜单中的第一项,它会根据名字与分支列出所有打开的工作副本;可以通过其层次化菜单项进行基本的分支管理。
项目导航器中的文件会根据状态进行标记。比如,如果使用Git,那么可以区分出修改的文件(M)、新的未追踪文件(?)以及添加到索引中的新文件(A)(如果没有勾选“Refresh local status automatically”,那么这些标记就都不会出现,除非选择了Source Control→Refresh Status)。
图9-1:版本比较
如果选择了Source Control→Commit,Xcode会弹出一个比较视图,列出所有文件中出现的所有变更。每个变更都可以从此次提交中排除(或完全恢复),这样就可以将相关的文件分组到有意义的提交中。选择Source Control→History也会弹出一个类似的比较视图(不过Xcode并未提供类似于Git自己的gitk工具这样的可视化分支展示工具)。合并冲突也可以通过一个图形化的比较界面来完成。
还可以通过版本编辑器在任何时刻查看当前正在编辑的文件的比较视图;方式是选择View→Version Editor→Show Version Editor或单击项目窗口工具栏中第3个Editor按钮。版本编辑器实际上有3种模式:比较视图、Blame视图与日志视图(从View→Version Editor选择,或使用工具栏第3个Editor按钮的弹出菜单)。
比如,在图9-1中,我可以看到在该文件的最新版本(位于左侧)中对supportedInter-faceOrientations实现所做的修改(因为Swift语言发生了变化)。如果选择了Editor→Copy Source Changes,那么相应的diff文本(一个补丁文件)就会被放到剪贴板中。如果切换到Blame视图,我就可以在编辑器中看到当前文件的所有提交版本。
还有一种方式可以查看某一行代码是如何修改的,方式是选中该行(在正常的编辑器中),然后选择Editor→Show Blame For Line。这时会弹出一个窗口,描述了将这行文本修改为当前内容时的提交信息;可以通过弹出窗口中的按钮切换至Blame视图或比较视图。