一. 前言
在Xcode9中重新定义了其自带的Git, 使版本管理更加的方便:
在左侧资源导航区块, 多了个 Source Control navigator 选项, 用于本地的Git仓库管理;

如果没有添加Git仓库, 这里是没有东西的:

二. 本地项目版本控制
2.1 添加Git管理
2.1.1 方式一
对项目添加Git管理支持, 可以在新建项目最后一步选择保存位置的时候勾选Create Git respository on my Mac 选项:

2.1.2 方式二
也可以通过终端对现有项目来添加仓库:
如果本地没有安装Git, 可参考 [Command Line]使用Command Line(终端)提交代码到远程库 如何添加Git.
通过 cd 指令, 进入到文件的根目录:
cd /Users/mac/Desktop/WKWebTest
然后通过 git init 指令来初始化一个Git本地仓库:
git init
然后通过 git add 指令, 添加文件到本地仓库:
git add .
最后的 点(.) 意思是将所有的文件都添加到Git仓库;
最后通过 git commit 指令提交:
git commit -m "提交"
后面是添加提交说明;
这样就建立了一个本地仓库:

2.1.3 方式三
也是最简单的方式:
在Xcode菜单栏: Source Control -> Create Git Repositories...

一般使用第一种来为新的项目添加Git管理, 使用第三种对已有项目添加Git管理.
添加Git管理后, 打开 Source Control navigator 会看到三个文件夹:
Branches : 所有分支
Tags : 所有标签
Remotes : 远程仓库

开始只有Branches文件夹下有一个主分支(master), 其他两个文件夹都是空的;
2.2 Commit 提交更改
接下来, 我们修改一下代码, 这里我在ViewController类里面打印了一句话, 并新加了一个People类:

这时, 会看到文件导航栏中, 文件名称后面有点小小的变化:

M : 修改的文件, 未提交, 这里是ViewController.swift文件
A : 新加的文件, 未添加到Git管理; 这里是People.swift文件
然后点击导航 Source Control -> Commit...

在弹出的页面中, 可以看到所做的更改:

最左边是变动的文件列表, 中间部分的左半边是文件变动之后, 右边边是文件变动之前, 下面的空白区域是填写提交的变更信息;
如果有多处变更, 我们不想一同提交, 可在最左侧选择要提交的文件, 同一文件里不同的代码选择可以在中间部分选择:

这里可以选择不提交, 或者取消更改;
然后点击Commit 3Files 即可!
提交成功后, 会看到主分支多了一个版本记录:

2.3 分支(Branch)管理
2.3.1 新建分支
在需要新建分支的分支上右键(开始是在master主分支上) -> Branch from ""...

然后填写分支名称即可!, 这里我起的名称是 "第一个分支"

由上图可知, 新建了一个分支, 并且当前分支切换到新建的这个分支上面来了, 注意分支名称后面的 current , 代表当前所处的分支! 这里所处的分支即为: 第一个分支!
此时提交的更改就会提交到这个分支上面
2.3.2 切换分支
分支间切换, 可在需要切换的分支上右键 -> Checkout
如下图所示, 当前分支是在 "第二个分支", 下面我切换到主分支(master)

选中master分支 -> 右键选择Checkout

会弹出是否切换的提示框, 选择 Checkout 即可!
如果在切换时, 弹出下面的提示:

这是因为, 当前所处的分支上有更改还未提交, 需要先提交了, 才能切换, 只需要 Source Control -> Commit..., 提交一下, 就能正常切换了. 如果当前的更改不需要提交, 或者不打算要的更改, 可以放弃当前的更改: Source Control -> Discard All Changes...

然后, 就可以正常切换了!!!
2.3.3 合并分支
分支的合并只能是各子分支与主分支之间进行!
将分支合并到另一个分支上, 只需要在需要合并的分支上右键 -> 选择 Merge "分支名称" into "另一个分支名称"
例如这里将"第二个分支" , 合并到 "主分支" :

也可以选择 "Merge 'master' into '第二个分支'..." 来将主分支的一些更改合并到"第二个分支" 上来!
2.3.4 删除分支
在新建的子分支上(主分支master是不能删除的)右键, 可以选择删除该分支:

2.3.5 合并分支冲突解决
在合并分支的时候, 难免会有冲突, 如果发生冲突, 会显示如下图所示的页面:

左侧是文件列表, 有冲突的文件旁边会有个红色的C, 中间部分是具体的冲突内容, 左侧为本地版本, 右侧为合并过来的分支版本, 带问号的需要你选择使用本地版本还是使用合并过来的, 选中某个冲突(带问号的哪一行, 如图中红色背景部分), 这时, 最下面中间部分有四个选项, 第一第四个都是保留两个版本, 第二个是使用本地版本(即左侧), 第三个是保留合并而来的分支版本(右侧), 这时做个选择即可, 图中4/4, 是共有几处冲突, 当前处在第几个冲突; 而且此时的Merge按钮是不可点击的, 当所有的冲突解决之后, 该按钮即变为可点击状态.

2.4 添加Tag
如果我们想对一些提交或者分支, 添加一些标记, 可以使用Tag:
在想要添加tag的commit或者分支上右键:
在提交(Commit)记录上添加Tag:

选择 Tag"a720618"... , 在弹出的选项卡内填上tag名称和说明:

这时, 提交的版本旁便有了一个tag标签:

左侧Tags文件夹内, 就多了一个Tag记录.
也可以在分支上添加Tag, 方法是一样的, 在要添加tag的分支上右键 -> 选择 Tag "第二个分支"...

在所选的tag上右键, 可以选择删除/添加新的tag或者分支等操作!!!
2.5 更改管理
2.5.1 取消更改
如果我们做的更改, 不想提交, 可在 Source Control 中选择放弃某个文件的更改: Discard Changes in "文件名称"...
或者选择放弃所有的更改: Discard All Changes...

也可以在提交界面进行舍弃(Discard):

注意: 这里的取消, 会删除这些文件, 或者这些的更改的代码!!!
如果仅仅只是不想提交, 但是还想保留这些更改的代码, 可以在提交界面进行选择不提交:

2.5.2 恢复到某次提交
如果想要将代码退回到某个版本, 只需要在要退回的版本右键 -> Checkout "***"... 即可将代码恢复到某此提交的版本:

2.5.3 多个版本比较
如果想查看某个文件的更改记录, 什么时间增加了什么内容, 可以选择这个文件, 然后打开Show the Version editor, 即下面这个反方向的双箭头:

例如, 这里查看People类的相关更改:

左半边是现在最新的内容, 右半边是某个提交版本的内容, 具体哪个版本的提交, 可以在下面进行选择, 即右下角的那里!
Log
也可以查看所有的Log: 点击 Show the Version editor 右下的倒三角, 选择 Log :

这时屏幕中间部分的右半边会显示Log信息:

点击, Show modified files 会显示两个版本的具体不同部分, 界面和上面类似!
Blame
同样在Show the Version editor 可打开Blame页面, 这里可以查看, 谁在什么时候做了哪些更改, 可用于责任定位:

当鼠标放到右侧各行时, 会有一个更多信息的符号i 点击后打开是这样的:

Show modified files 和 Open in Comparison 都是可以点击查看具体的更改内容的!!!
2.6 忽略配置文件.ignore
Git 提供了一个机制去忽略这些文件:这类文件后缀名为 .gitignore 。
这个文件不需要我们手动去写, 可以按如下方法下载:
打开终端输入:
git config --global alias.ignore '!gi() { curl -L -s https://www.gitignore.io/api/$@ ;}; gi'
这样对于任何使用 Git 的工程,只需要输入以下命令行(如果是OC项目,将下面代码的swift 替换为 Objective-C )就可以下载一个.ignore文件:
首先cd到文件根目录:
cd /Users/mac/Desktop/GitTest
然后接着输入以下指令:
git ignore swift,macos >.gitignore
git add .gitignore
git commit -m "Add .gitignore file"
这时, 再去查看项目文件夹, 会发现多了一个.ignore文件, 当然这个文件是隐藏的, 也可看不到:

三. 远程项目版本控制
3.1 绑定Github账号
新版的Xcode9 与Github深度整合, 现在可以在Xcode -> Preferences 中添加Github账号, 点击左下角的 "+" 在弹出的列表中选择 Github :

然后输入账号和密码, 即可!!!

3.2 将项目上传到Github
现在将项目上传到Github的时候, 只需要在Source Control navigator页面操作即可, 选择项目文件夹(蓝色那个) -> 右键 -> Create "GitTest" Remote on Github...
其中 GitTest 为项目名称;

然后在弹出的页面中填写相关的信息:

主要是选择账号, 项目名称, 说明等, 点击 Create 即可!
PS: 如果这里一直创建失败, 可能是远程仓库名称冲突了, 换个名称提交即可!
完成后来到你的Github账号, 就会看到刚刚提交的项目:

3.3 Push & Pull
远程仓库建立之后, 更改只要执行一次Push即可:

与远程版本同步可执行Pull
3.4 从Github克隆(clone)到本地
在Xcode导航栏, 选择 Source Control -> Clone...

所有你账号下的项目都会出现在这里, 选择自己需要的点击clone:

最后选择一个保存位置, 即可!!!
网友评论
用Github协作开发的话就是:
比如两个人协作开发 A的Xcode里从Github上克隆下来就有master分支
B的Xcode里从Github上克隆下来就有master分支
A在A的xcode上创建 A1 .A2 . A3三个分支 此时B的Xcode上是没有A1 .A2 . A3这三个分支的
B同理
A写代码的话 就在A1这个分支上写 B 也同理在B1的分支上写 等写好确认没问题之后
A B在分别把A1 B1分支上的代码合并到主分支Master上