《How To Use Git Source Control with Xcode 9》翻译:Xcode9自带Git使用

刚更新完Xcode9,发现自带的Git功能的用户体验比之前版本都有很大的提升。网上搜索了一篇使用文档做一下翻译,原文地址:https://www.raywenderlich.com/153084/use-git-source-control-xcode-9

原创翻译,转载请说明。


无论你是独立开发者还是团队开发,项目如果不使用代码控制的话你懂得。代码控制可以帮助你还原旧版本代码、在不会影响正在运作的应用的同时增加新的功能、清楚地知道你的代码在每个阶段的改变、增加团队协作效率,简直鹅妹子嘤。Xcode自带的Git就是一个十分优秀的代码控制系统(啧,Xocde8的Git真是问题多多,不过Xcode9的Git确实体验不错,推荐)

Linus Torvalds开发了一款主要运行在Lunx内核上的分布式版本控制系统Git。使用Git有一件很开心的事是Git并不需要任何核心仓库的支持,那就意味着每个人都可以拥有自己的仓库。(个人认为这也是比SVN好用的其中一个大原因,Git的诞生其实和SVN有一定的关系,其中的趣事可以百度一下)

在这篇文章中,你将会了解到Git以及如何使用Xcode自带Git。

Gitting Started

这里我们不讨论Git的内部原理,而是去试试如何使用。先创建一个Xcode项目,然后尝试一下通过Git版本控制的常用功能。

打开Xcode ,创建一个Single View Application project.

补充模板中的配置项(其实这一步比较无所谓,按照具体项目操作):

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. 选项卡会让你选择把项目保存在哪里. 确保版本控制选项打勾,如下图。

: 如果没发现这个选项的话点击Options按钮.

Xcode会帮你在创建新的项目的同时创建好一个新的Git仓库。

所有版本控制系统包括Git在内会把数据存入一个仓库中,这样Git就可以实现管理你的项目版本和时刻追踪开发周期中的每一次代码变动。可以把仓库看做是存储各版本各种信息的数据库。

你项目中的所有操作:添加文件、修改代码、修改的次数等都会被记录。

当项目发生修改并且修改完自己觉得没问题的时候,就可以把这些更改放入仓库。之后你可以随时将代码切换。

那当前按照项目模板创建的代码将会如何呢?

刚创建的项目中只包含了这些配置文件。除了Xocde帮你自动配置的这些以外还没有任何内容可以提交。

点图中左侧标红按钮,打开版本控制导航(快捷键:cmd+2)。同时让右侧的版本控制检测栏也开着(快捷键:cmd+Option+3)。在左侧面板中点击三角形可以显示出在存储库中配置的所有分支、标记和远程操作。点击master分支,然后在编辑窗口点击Initialcommit就可以看到Xcode自动提交的详细信息

Now, make some changes to your project. OpenAppDelegate.swiftand change the methodapplication(_:didFinishLaunchingWithOptions:)to the following:

现在来试试写一点代码。打开AppDelegate.swift将_:didFinishLaunchingWithOptions:方法中的实现部分改成以下内容。

funcapplication(_application: UIApplication,        didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?)->Bool{print("Application did finish launching")returntrue}

保存后你会注意到AppDelegate.swift边上会有一个“M”标识:

“M”代表“发生更改”,意思是你对这个文件进行了修改但是还没有提交此次的变化到你的本地Git仓库中。

接下来打开ViewController.swift在viewDidLoad():方法后添加以下代码:

@IBActionfuncbuttonClicked(_sender: UIButton){print("This is a Git tutorial")}

打开Main.storyboard,拖一个button进去,再更改以下button的显示文本。

最后要把button的点击事件和代码绑定。。。。(啊不想细说这部分了,iOS的入门可以自行某度吧)

修改完成后你会发现你有进行修改过的文件右侧都出现了“M”。

Run一下试试。。。

好了这就意味着当前代码是没问题的,就可以提交啦。

Xcode顶部菜单栏中点击Source Contro->Commit

点完就会出现一个新的界面,就像下面这样的:

主界面被分成两部分。左侧窗口显示的内容是最新的代码。如果你是第一次提交,那左侧显示的就是从创建项目开始的所有开发代码。右侧窗口显示的是修改前的代码。

左侧面板1:未提交修改的文件列表。默认为所有未提交的文件全部选中。不过不想提交的话手动取消勾选。通过对比具体代码内容窗口,可以对文件中的修改内容进行是否需要提交的选择。代码内容窗口中蓝色高亮部分为发生变化的代码区域,就算你增加或者删除了一个空格的改动也会被标注高亮。

内容窗口中间区域2:列举当前文件中所有更改的内容。每个更改默认都是选中状态,同样可以根据实际情况手动不勾选。例如change3比较无所谓,取消勾选后就这段修改就不会被提交。

底部输入框2:在你提交之前,Xcode会要求你填写提交信息。此处填写的信息能帮助你更容易理解每一次的提交内容和目的(个人认为尽量多花点时间在写每次提交的信息上,当开发团队逐渐扩大、代码量上去之后,提交次数会越来越多,如果想花更少的时间去寻找或者了解每次提交的版本的内容的话最快捷的办法就是通过这些信息)

点击Commit。完成提交后就会看到以下内容。

Branching Out

Code自带Git支持提交修改内容到指定分支。先解释什么是分支:一个分支可以看做提交内容的集合。在不同分支中操作可以降低修改代码内容带来的可能会影响项目原先功能的风险。

仓库创建的时候Git会自动创建一个叫做“mater”的分支,以上的操作其实都是在这个分支中进行的。master分支一般用作保存项目稳定代码,其它的分支用作日常开发。(Git和SVN同样有命名规范但也不是硬性的要求,所有开发人员都遵循一套标准方便对代码进行管理。例如:master:线上版本分支;developer:测试版本;其它分支:项目中每个开发人员独立分支用作日常开发)

举个例子:如果准备在开发版本中添加一个新的文件,就像下图中新增了MapForItinerary类。

MapForItinerary.swift文件边上会出现“A”的标示,意思是这个新增文件还未被提交到仓库。同样的道理进行提交操作:

如果你选中带“A”标示的文件,你会发现Xcode并不会显示先前版本的信息进行比较。新文件当然没有咯。

添加新功能势必会对原代码造成很大变动。使用新分支能帮助你杜绝因此造成的各种风险。点击左下角的齿轮按钮,选择Branch from “master”

填写新分支的名称,点击Create:

Xcode就会帮你创建一个新的分支,初始选中。当前分支的边上会显示(current)

再次提交:

提交完成后,有进行提交过的文件边上的标示将会消失:

Backing Out

一天你在项目的最新版本中加一个很酷的功能,吃了个下午茶后发现可能有更好的实现方式,这时候你想回到最新版本的初始状态重新开发。

使用Git就能很容易地实现 :]

(以下又是一顿操作)

如果你不希望保留这些的修改操作,可以在Xcode的导航栏中选择selectSource Control\Discard Changes

Xcode会与你确认是否要做此操作(毕竟不小心discard还是有一定风险,原本写了好几天的代码说没就没了,而且是再也找不回来的那种)

不仅可以放弃一个文件的整体更改,还可以像提交那样选择文件中的部分内容放弃。

好了,你之前的修改都没了,也没有内容可以提交了。既然已经尝试过放弃更改,您可能会想知道这两者之间的区别是什么,以及您之前选择的不提交选项。虽然这两种选择都导致了存储库中没有记录的更改,但是有一个很大的区别:如果在commit时选择忽略某个修改内容,那么这个修改将不会被提交,但是本地源码中还是会有修改记录。discard不仅忽略修改内容,还会将本地源码还原。

Time Travel

如果想恢复代码,Discarding changes是一种比较节省成本的做法。但是有些情况下使用可能会带来一些麻烦。Git提供项目可以保存多个版本的功能。所有内容将会保存在仓库里,通过Git可以对其进行管理。如果你选择discard changes一个文件,Git会把这个文件恢复成最后一次提交的版本中这个文件的内容。这就是限制所在。

随着项目的更新迭代,你的项目仓库中的版本会越来越多。如果你想回到第一个或者第二个版本的话,通过discarding changes就没办法做到。但是Xcode和Git还有其它功能能很容易实现这个需求。

选择ViewController.swift. 选择View\Version Editor\Show Comparison View. 在Xocde的右上角切换到第三个按钮。

就会像下图一样出现版本编辑:

你可以比较两个版本内容。默认状态下当前内容显示在左侧,Git仓库中存储的最新版本内容显示在右侧。如果想与仓库中更早版本进行比较,点击右下角的⏲️按钮就可以选择你想要的版本。

如果想恢复到具体版本,只需单击比较窗格中的更改号旁边的箭头,然后选择Discard Change

Once you finish reverting to an earlier version, you will need to commit this “new” version of the file as the most recent. Go ahead and do that now.

一旦恢复成之前的版本,就相当于当前又是一个新的版本,所以同样需要提交。

如何分辨哪个提交是你希望切换的呢?按住版本编辑按钮,选择Log。或者在菜单栏中选择View\Version Editor\Show Log View。

Xcode会罗列出当前文件的所有提交内容。每次提交都会有一个唯一标识符。

这些标识符与之前使用的更改历史列表中所示的标识符匹配.

同样可以通过点击Show modified files显示详细内容。

另一个实用功能为Blame。在这个界面中你可以看到文件中在每次提交时的变化。

按住版本编辑按钮并选择Blame. 或者从菜单栏中选择View\Version Editor\Show Blame View.

如果想看提交更改的详细内容,点击日期边上的ℹ️按钮。

Merging Branches

You learned earlier that Git allows you to work on multiple streams of revisions known as branches. You also learned that it is good practice to do all of your development on a branch other than the master branch. What, then, are you to do when you finish development of a feature and want to release it? Simple! You merge your development branch into your master branch.

在前面了解到Git允许在多个被称为分支的修订流中工作;在master分支之外的分支上执行所有的开发是一种很好的体验。当完成一个新功能的开发并想要发布它时,就需要把当前分支合并到mater分支中。

新功能还没有完成,但产品经理明确需要在主界面中添加另一个文本。要实现这一点,需要暂时离开开发新功能的这个分支,并从稳定的主分支中再创建一个新的分支。

具体操作如下:

创建完成后当前选中分支并没有发生变化,右键点击新创建的分支,选择Checkout


Xcode问你确不确定,当然确定咯。

这样新的分支就会变成刚才创建的分支,分支名右侧多了(current)

现在就可以根据产品经理的新的要求进行一顿操作。

功能开发完毕并Run了没问题后提交。与上面操作一样,先切换到master分支。右键点击刚才发生修改的分支,选择Merge “new_label” into “master”

Xcode又问你确不确定,你说确定合并。

合并窗口将出现用于控制合并的过程。合并源(the “merge from” branch)将出现在右边。您当前的代码,也就是合并后的代码将出现在左边。使用屏幕底部的按钮来控制合并的方向。对于一个简单的合并,比如这个,使用Xcode的默认设置即可。

最后点击Merge按钮开始合并。

If all goes well, you should see the changes (theUILabel) from the new branch appear in the user interface when you click onMain.storyboardor when you run your application. Now your changes are in the master branch because of the merge! Use one of the methods of viewing your commit history that you learned to verify that this change appears in the history.

Ignoring generated files

在第一次提交的时候可以发现,除了代码文件之外,Git还跟踪Xcode的各种文件。因为这些文件对于项目来说和代码文件同样重要。你需要这些来与团队成员共同完成应用开发工作。但是App的每次build都会使Xcode生成新的文件。Xcode会自动地重新生成这些文件,所以保存这些内容并没有实际意义。不仅没有意义,还可能让你在提交历史中查找修改内容增加了难度。Git提供了一种机制来忽略这些文件:.gitignorefile。macOS会把它当作一个隐藏的文件,所以当你在Xcode或Finder中查看你的项目内容时是不会看到这个文件的。但是不要怕,Git就能找到它。

不需要自己做,可以从gitignore.io上下载到此文件。

打开Terminal,输入以下代码。这些操作只要做一次,不需要在每次开发新项目的时候重复操作。

$git config --global alias.ignore'!gi() { curl -L -s https://www.gitignore.io/api/$@ ;}; gi'

Now, for any project using Git, do the following in aTerminalwindow:

cd

git ignore swift,macos >.gitignore

git add .gitignore

git commit -m "Add .gitignore file"

接下来就开始下载最近在macOS上用Swift开发的常用.gitignore配置文件。Terminal大概会显示下面这些内容:

.gitignore文件作为项目的一部分,Git同样会追踪文件的新增和更改内容。

注意:最好在项目开发之前完成.gitignore文件的添加。

Xcode and GitHub

至此所做的所有工作都是使用存储在计算机上的本地仓库中。GitHub提供远程仓库让开发者将自己的项目发布在上面。这个功能给团队开发带来许多便捷。(GitHub的私有仓库是收费的,不过现在的互联网公司应该都会创建内部私有库,如果没有的话推荐使用:某云)

如果还没有GitHub账号,那就先去GitHub注册一个。完了之后你需要在Xcode中授权GitHub。打开Xcode的Preference并选择Accounts。点击左下角的➕按钮,选择GitHub。

如果在你的GitHub账户上启用了双重身份验证,Xcode需要你输入验证码。

Xcode会显示添加成功的GitHub账户配置。如果已经配置了SSH密钥,可以随意切换到SSH进行克隆。

在代码控制导航栏中右键点击左上角项目名称,并选择Create “GitUseExample” Remote on GitHub

Xcode会帮你设置好默认配置,点击Create。在代码控制导航栏中就会看到Xcode已经添加了一个名字叫做origin的远程仓库,仓库中也有一个master分支。

如果要将项目内容推送到远程仓库中的对应分支中,选择Source Control\Push

右键点击远程仓库中的某个分支,选择selectView on GitHub,就可以看到GitHub中的该分支的具体内容。

如果每次更改都要推送到远程分支中,那么修改后Run没问题的话,点击Source Control\Commit,再点击Source Control\Push。

Success! :]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容