您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
理解 XCode 中的 Git 版本控制(一)
 
作者 kangear的博客,火龙果软件    发布于 2014-07-30
   次浏览      
 

在应用程序开发过程中,一个相当显著的部分是开发人员管理代码变更的方式。这些是必须包含的功能,存储和处理工作代码版本在不同阶段稳定阶段的副本,并能够恢复代码当存在缺陷或者产生问题的时候。更有甚者,当多个程序员工作在同一个项目时,跟踪所有的变更是一个单向的路径。幸运的是,开发人员不必去发明一种方法来做这些事情,有一个特别的软件解决方案,叫做版本控制系统(Version Control Systems)

版本控制系统或者叫做修订控制系统,实际上是一种能够一直监视代码文件的变更并存储他们为了将来引用的机制(软件)。除了这些之外,版本控制系统也保存了额外的必要数据,例如哪个开发人员做了变更,变更发生在什么时候,实际上修订了什么,其他类型的历史不仅仅是数据。而且,版本控制系统提供了比较代码不同版本的功能,如果需要的话,可以恢复特定文件或者整个项目到以前的版本,并追查恶意的代码最终实现无缺陷产品。

使用版本控制系统,开发人员可以工作在项目的不同路径上,通常叫做分支(branch),当他们的代码完成时,所有的代码将合并到一起以便构建应用程序的最终发布版本。这个过程叫做合并代码(merging),它包含了版本控制系统的一个特殊特性。实际上,在开发团队和软件公司中代码的版本控制是一个强制性的工作,团队中的每个人负责项目的一部分,最后所有的代码被集中到一起放置在一个地方。

对个人开发者来说使用版本控制系统不是必要的,但是仍然是强烈推荐的。一旦遇到严重的问题或者说以代码都乱套了的时候,使用版本控制系统将更容易追查缺陷或者恢复代码到稳定版本和代码的工作版本。事实上,许多的个人程序员,特别是新人,根本不使用版本控制系统,当他们增加新功能或者是修改代码的时候,通常手动复制项目的副本。这是一个非常不好的习惯,源码控制能更好并且更有效率的完成这些工作,同时提供了前面描述的额外功能。

作为最出名的版本控制系统之一,git由Linux创建者 Linus Torvalds开发。Git在虚拟目录(仓库)中组织一切,实际上,任何版本的跟踪都可以适用于他们。它既可以通过命令行使用,也可以通过桌面应用程序。如果git对你来说很陌生,那么我建议你在网络上阅读一些关于git的文章,而进一步讨论git超出了本教程的范围。

自从Xcode的第五版本起,就集成了git的丰富功能,包括各种选项菜单的按钮和管理源代码的子菜单。正像你稍后看到的,使用版本控制git是非常容易和快速的,在你看完本教程之后,没有理由不使用它。

总结而言之,你已经理解了我们的任务是学习怎样在Xcode中使用版本控制git,这一切将通过了解Xcode提供的每个相关特性来完成。如果你不熟悉所有的东西,或者在我们开始之前你需要获取更多的知识, 请在网络上搜索相关信息。我不得不说,在本教程中我假设你关于版本控制系统拥有最基本的知识,比如git是什么,因此我们要把它视为理所当然的事情,而关注Xcode怎么管理这一切。

Git示例演示

与其他教程的演示程序相反,本文中我们不会实现一个应用去展示iOS SDK的具体特性,也不会有一个最终的开发样本。实际上我们所做的就是去创建一个示例项目,仅仅在几个点上添加几行代码,我们将使用它作为一个工具去测试Xcode提供的所有源代码控制管理选项。换句话说,我们重点讨论的是IDE,而不是iOS。

除此之外,这一次不会有可供下载的例程了。取而代之的是,我邀请你一起来一步步实现这个 demo,并且在需要写代码的地方手动添加代码(别担心,不会很多)。这样跟下来是有必要的,因为我们将会重复进行多种与版本控制有关的操作,并且我们必须即时看到结果。如果我只是提供一个操作已经完成的例程,就不可能有这样的效果了,因为这样下来你自己的练习部分近乎于零。

那么,让我们开始吧!我们用 Xcode 来近距离地看一看版本控制系统的精华所在。

创建 Git 仓库

每次在 Xcode 中创建新项目,都会让开发者选择是否要添加一个本地 git repository。新建一个 project 涉及分为3步的引导过程,其中在第3步也就是最后一步中,Xcode 提供了一个勾选框和相应的说明,如果勾选了,一个 git repository 就会添加到保存 project 的目录中。这个选项很容易被忽略,或者被当做一个 Xcode 的没用特性,这种事经常发生,尤其是对于从来没用过版本控制和 git 的开发者,或者新手程序员。

具体细节如下,启动Xcode并创建一个新项目。首先,选择“单视图应用程序(Single View Application)”作为应用程序的模板,同时在iOS选项部分,选择“应用程序(Application)”项。

点击“下一步(Next)”按钮到第二步,设定“产品名(Product Name)”字段为“GitDemo”,同时确保在“设备(Devices)”下拉菜单中选择“iPhone”。在这里不需要iPad或者普通应用。

再次点击下一步按钮,进入最后一步。在此,首先选择保存项目的目录。然后选中窗口的底部的单选框,并选中在“My Mac”上创建git仓库。

默认情况下,这个勾选框总是被选中的,然后每个 project 都会创建一个 git repo。如果你的项目不想用 git 和版本控制,只需取消选中,但我不建议这样做。总之,本教程中我们希望启用git,因此确保你选中了勾选框。最后,点击 Create 按钮。

等待 project 创建完成吧,然后打开一个 finder 窗口,来到我们保存 project 的目录下。在这里,找到 .git 子目录,这是 Xcode 自动创建的目录,用来存储 git repository 相关的数据。

如果你看不到 .git 目录,你必须把电脑上的隐藏文件改为可见。首先,打开Terminal(终端) 窗口,然后输入以下命令:

对于 OS X Mavericks 10.9:

defaults write com.apple.finder AppleShowAllFiles  TRUE

对于此前的 OS X 版本:

defaults write com.apple.Finder AppleShowAllFiles TRUE

然后,只需重启 Finder 应用,所以再输入一条命令:

killall Finder

因此,如你所见,这个 app 的本地 git repository 实际就保存在这里。相应地,你创建的任何新应用都会随之带来一个 .git 子目录,只要你保持相应的选项是勾选的。

显然,用 Xcode 来为 project 添加 git repository 是不费吹灰之力的。然而,如果你在创建 project 时没有添加 git repository,或者想要稍后再添加,怎么办呢?好消息是,你随时都可以为 project 添加 repository,但是不用 Xcode 了。尽管这样的情况很少见,我还是来讲解一下。

注意,如果你不想看的话,可以尽管跳过本教程的下一节。但我建议还是读下去,因为紧接着再下一节的内容会非常重要。

在开始讲之前,你首先需要在 Xcode 里下载 Command Line Tools ,因为我们接下来要用 Terminal ,需要一些工具。如果你已经下载了这个包,就进行下一步。如果没有,要安装 command line tools,点击Xcode里的 Xcode > Preferences… 菜单,然后选择 Downloads 一项。在窗口的上部,Components 一栏下,点击 Command Line Tools 右侧画着向下箭头的按钮。一旦下载结束,下载按钮会变成对勾符号。

然后,为了这个例子再创建一个 Xcode project,我们一切完成之后再把它删除。这一次确保要取消勾选 Create git repository 选项。在这个例子里,我们不需要 Xcode 来为我们准备 repository 了。把这个项目命名为 NoGitExample,并且保存在桌面上,这样就能直接使用我接下来的提供的指令了。

一切就绪,打开一个 Terminal 窗口(如果之前已经有打开的窗口,确定要先关闭再重启,这样才能应用安装 command line tools 时做出的改变)。首先,来到保存新 project 的目录下:

cd /Users/YOUR-USERNAME/Desktop/NoGitExample

别忘了把上面的指令改为你自己 Mac 的用户名。接下来:

git init

这会初始化一个空的 repository。然后如果你打开 Finder 或者在 terminal 输入 ls 指令,你会看到 .git 子目录已经创建出来了。太棒了。继续往下:

git add .

用这个指令,当前目录(点号[.])的所有内容都会添加到 repository 中。最后,提交全部(也就是持久保存所做的更改):

git commit -m 'Initial commit'

Terminal 窗口中会出现提交到本地 git repository 的文件列表。下图就是我的terminal的样子:

git repository 已经准备好了,但是如果你回到 Xcode,打开 Source Control 菜单,你会发现一切都还是不可用的。

这是因为 Xcode 不会自动被通知到,我们已经手动添加了 git repository。因此,点击菜单 Xcode > Quit Xcode 来关闭 Xcode ,然后再重启。现在,在 NoGitExample 项目中,如果你再打开 Source Control 菜单,你会看到这些的选项都可用了,跟我们创建 project 时就添加了 git repository 的效果相同。

到了这一步,就可以关闭这个 NoGitExample 项目,也可以把它从桌面上删除了。

现在你已经能够知道怎么为一个 project 添加 git repository了。并且即使你在创建 project 时有意或无意没有添加 git repository,也可以随时手动添加。

提交更改

说到所谓的“提交更改到 repository”,我们实际的意思是:存储我们项目的一个新版本。新版本包含目前已作出的所有更改,比如代码修改或者新添加的文件。一般来说,一次提交应该发生在一定量的工作已经完成,并且项目处于稳定状态之时。关于提交的频率应该是多久一次,并没有一定之规,但我建议:如果你认为从上一次提交到现在之间,你所做的工作如果意外丢失,会造成巨大的时间精力浪费,那就一定要提交一下了。

Xcode 默认会在新项目创建时做一次初始提交,目的是保存一个项目初始状态的版本。这次提交是在幕后完成的,不会打扰你,也不会要求你确认。如果你在创建项目时没有添加 git repository,是如前所述在之后手动添加的,初始提交是通过这个指令完成的:git commit -m ‘Initial commit’ 我们之前用过这个指令。

实际上,你可以看到初始提交的相关信息,只需点击菜单 Source Control > History… 。在这里记录了你对项目的每一次提交。

我们现在来尝试一些操作吧,首先要对项目做点改动。来到 ViewController.m 文件,在 private class 部分添加以下的 property 声明:

@interface ViewController ()

@property (nonatomic) int sum;

@end
接下来,修改 viewDidLoad 方法如下:

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.

int a = 5;
int b = 10;

self.sum = a + b;

NSLog("The result is: %d", self.sum);
}

如果你看一眼 Project Navigator (即左边栏),你会注意到在 ViewController.m 文件后面,多了一个字母 M,如下图所示:

这意味着这个文件已经被修改了,并且相比上次提交的版本确实有改动。一般来说,每次你改动一个文件之后,字母 M 就表示已有改动,还未提交。

让我们来看看怎么提交代码。这是很简单的,仅需要打开Source Control > Commit菜单,如下窗口所示:

一步一步的让我们看看它告诉了我们什么。在左边方框(在图片中标识为#1的部分),这儿列出了所有已修改的文件。在我们的例子中,仅仅ViewController.m文件被修改,因此仅仅显示了一个文件。如果你仔细观察,你将看到文件的左侧有一个缺省选中的复选框。假如你不选中它,已经修改的文件将不会被提交。但是现在这不是我们想要的东西,因此让它被选中。

在窗口的中间位置(标识为#2的部分),有两个预览框。左侧是文件的当前版本(没有提交的),右侧是文件的最近提交的版本。截图描绘了ViewController.m文件的原始状态。

左栏的蓝色区域(图中标识为#3的部分),在右栏变成一条线,这显示了文件中的实际改动。这样的表示法让所有的改动一目了然,并且能对应到改动的具体位置(行号)。也许你注意到了,窗口的中央,在两个预览栏之间,有一些小的圆角标签,上面写着数字(图中标识为#4)。这些标签一个一个地数出了全部的改动,上面的数字就是计数的序号。在数字左边,有一个对勾符号。如果出现了这个对勾,说明对应的改动可以正常提交到 repository。尽管如此,你还是可以选择跳过,暂时不提交文件的某一个或几个改动,甚至抛弃所做的更改,只需点击数字右边的小下三角。含有两个选项的小菜单将会浮现:

如果你选择 Don’t Commit 选项,对勾符号会换成禁止符号,对应的改动就不会提交到 repository 了。

如果你选择菜单中的 Discard Change 选项,会出现一个确认窗口,提醒你选中的改动将会被回滚,并且回滚是无法被撤销的。

如果你点击 OK 按钮,响应区域中的改动会消失无踪,仿佛从没来到世上。

如果你有留心观察上面的提交窗口截图,你会发现所有的修改都会被 Xcode 认为是改动,即使一个空行也不例外。事实上,空行是屏幕上不显示的换行符,所以它被收集为一项改动是合情合理的。

总之,对于这个样例,确保你没有丢弃任何改动,允许一切都提交。因此你应该看到所有的圆角 label 上都有对勾。

在这两栏之下是一片空白区域,中间写着“Enter commit message here”。这个区域用来附加一些简短信息,描述这个版本所做的更改。点击它,填上下图所示的内容:

填写(有意义的)提交信息至关重要,尤其是在提交次数很多的情况下。所以,要把它当做不可或缺的一步。

既然我们已经浏览了一遍这个窗口的主要内容,下面我们来做第一次提交吧。在窗口的右下角,有一个按钮写着:Commit 1 file.

在这个按钮里,总是会写着提交的文件总数。点击它,然后恭喜!你的第一次提交已经诞生,将会永久载入历史,不仅是你个人的历史,也是 git 的历史。这是什么意思呢?只要打开菜单上的 Source Control > History…,就可以看到它列在这里。

如你所见,我们之前写的提交信息以及改动的文件总数都出现在这里了。在 Xcode 做出的初始提交中,提交了所有文件;但是我们只改动了其中一个。

除此之外,如果你关闭 history 窗口,再看看 Project Navigator 左边栏,ViewController.m 文件旁边的 M 字母也消失啦!

现在,我们准备再做一次提交吧。这一次,我们来为项目添加一些新文件,最好的方式莫过于创建一个新类。那么,按下键盘上的 Command + N 键,然后添加一个 Objective-C class。把它设为 NSObject 的子类,命名为 TestClass。最后,添加到项目中。

一旦上面这些都完成了,注意左边栏 Project Navigator 中的两个类文件旁边都出现了一个字母 A ;意思是这两个文件是后添加到项目中的,因此自然它们还没有被提交过。

打开 ViewController.h 文件,然后 import 我们的类:

<!DOCTYPE HTML>

接下来,打开 ViewController.m 文件,如下声明一个 private 属性:

<!DOCTYPE HTML>

再看左边栏 Project Navigator,注意到现在有4个没有提交的文件了。两个类文件是我们刚添加的,还有另外两个本来就有的文件。我们需要将这些改动也提交,因此打开 Source Control > Commit… 菜单。

这一次,选中了5个有待提交的文件。第5个文件(显示在第1行)是项目的配置文件,是在添加新类时由 Xcode 自动修改的。如果你点击 TestClass.h 或 TestClass.m 文件,左(译者注:原文可能笔误,此处应该为“右”)栏会变为一片空白,如下图所示:

这是因为这两个文件之前没有提交过,因此没有之前的版本可以对比。所以,右栏里只写着“File was added” 就是再正常不过的了。

来到提交信息区域,填写提交信息: TestClass class was added to the project。完成之后,点击 Commit 5 files 按钮,让 Xcode 提交更改到 git repository。

第二次手动提交已经顺利完成了。可以打开提交历史来验证,在菜单 Source Control > History… 中:

   
次浏览       
相关文章

每日构建解决方案
如何制定有效的配置管理流程
配置管理主要活动及实现方法
构建管理入门
相关文档

配置管理流程
配置管理白皮书
CM09_C配置管理标准
使用SVN进行版本控制
相关课程

配置管理实践
配置管理方法、工具与应用
多层次集成配置管理
产品发布管理
最新活动计划
LLM大模型应用与项目构建 12-26[特惠]
QT应用开发 11-21[线上]
C++高级编程 11-27[北京]
业务建模&领域驱动设计 11-15[北京]
用户研究与用户建模 11-21[北京]
SysML和EA进行系统设计建模 11-28[北京]


软件配置管理的问题、目的
软件配置管理规范
CQWeb 7.1性能测试与调优指南
为什么需要使用ClearCase
ClearCase与RTC的集成
利用ClearQuest 进行测试管理
更多...   


产品发布管理
配置管理方法、实践、工具
多层次集成配置管理
使用CC与CQ进行项目实践
CVS与配置管理
Subversion管理员


配置管理实践(从组织级到项目级)
通号院 配置管理规范与应用
配置管理日构建及持续集成
丹佛斯 ClearCase与配置管理
中国移动 软件配置管理
中国银行 软件配置管理
天津华翼蓝天科技 配置管理与Pvcs