Luna Tech

Tutorials For Dummies.

GitHub+Xcode初体验

2018-09-15



0. 前言

今天这篇文章讲的是如何使用 GitHub 做 Xcode 的版本控制(Version Control),为什么要写这个主题呢?

  1. Version Control 的必要性(这个不用多说吧,有开发经历的人都懂);

  2. 不用 GitHub,还能用什么做 Version Control?

    1. Google Drive - 不推荐;
    2. 本地复制备份 - 也不推荐;
    3. IDE 自带的 Version Control tool - 可以,但是更推荐 GitHub;

GitHub 是什么?为什么要用它?

  1. 广泛认可:GitHub 是一个基于 Git 的 web 协作社区,也是目前世界上最大的开源软件社区;

  2. 代码托管:代码可以上传到 GitHub,作为备份,就算电脑丢了或者硬盘坏了,也不至于从头开始。

  3. 团队协作:GitHub 的项目可以邀请其他人一起参与,如果团队里面的人都熟悉 GitHub 的基本操作,上手会很快,项目的版本控制也可以非常高效便捷。

  4. 找工作面试的加分项:作为 IT 学生,GitHub 的熟悉程度已经成为雇主非常看重的一部分,很多 Job Description 都要求申请人有 GitHub 的 active account。

我自己对 GitHub 的认知发展

  1. **一年前:**我一直听别人提到 GitHub 这个网站,但是对于它的功能还是很模糊,觉得就是一个分享项目的平台,版本控制因为自己接触的不多,也没有切身的体会。
  2. **半年前:**在 5136 开发项目的时候,因为是多人作业,有人提出用 GitHub 做版本控制,但是由于大家都没用过,对于一些功能 push,pull,merge 没有实际的经验,加上作业时间比较紧张,就没有去学这个,最后选择了 Google Drive 来做 Version Control,但是实际的效果非常差,很多时候大家都没有去下载最新的版本,自己管自己开发,在合并代码+测试的时候,出了很多问题,也浪费了很多时间。
  3. **一个月前:**上周我写完了 iOS 的第一个作业,我用的 Version Control 特别原始,就是每当有一个稳定版本,复制一下项目文件夹,备注这个版本的日期+功能,然后再继续开发。这个方法有用,但是不完美,我到最后一共有将近 30 个文件夹,要追溯自己的真实开发过程和每个版本的功能,其实难度很大。
  4. **现在:**iOS 的第二个 assignment 是小组作业,我下定决心一定要把 GitHub 利用起来。

PS: 之前不用 GitHub 还有个原因是免费账号只能创建 public repository,近期我才知道其实在校学生可以升级账号,创建 private repository(后面会讲如何操作)

因为自己用 GitHub 也不是很熟,所以我先看了一些教程,然后进行了几次操作。

一方面自己要熟悉这些操作,另一方面也要跟队友沟通,保证大家都能正确进行基本操作。

前前后后总共花在这个主题的时间差不多有 6 个小时,这篇文章也是站在实用的角度,把新手会用到的一些基本的操作步骤详细地写出来。

如果你对 GitHub 感兴趣并且想真正的把它用起来,可以把这篇文章当做入门。

因为我当下的需求是把 Xcode 的 project 用上 GitHub,所以本文将用 Xcode 这个 IDE 作为案例;不过其他的 IDE 用起来应该也是大同小异。

Note1:我主要采用截图+描述的方式来阐述,如果图片太小,可以点击放大。

Note2:文章基于我自己的操作尝试,如果有错误或者不完美的地方,希望各位大佬指正。

文章结构

  1. 如何把免费账户升级到 education pack(这步完成后可以创建 private repository);
  2. 如何将 GitHub 账号关联到 Xcode;
  3. 如果将本地的 Xcode project 创建到 GitHub;
  4. 本地 project 的修改如何同步到 GitHub(push);
  5. 主线 Master 和分支 Branch 的基本知识(如何创建并合理使用分支 Branch);
  6. 如何在本地进行 Branch 之间的代码合并(Local Merge),并且同步到 GitHub;
  7. 如何在 GitHub 进行 Branch 之间的 merge 并且同步给本地;
  8. 如何邀请团队成员共同开发项目。

1. 账户升级

Step1:用自己的邮箱创建一个 GitHub 账户(此时免费账户无法 create private repository)

Step2:到这个网址,选择 Students

https://education.github.com/

Step3:输入学校邮箱。

Step4:验证邮箱。

Step5:验证成功。

Step6:再回到刚才的页面,填写相关信息。

Step7:当当!现在你就可以创建 private repository 啦!


2. GitHub+Xcode

Step1:Xcode->Preference->Accounts

Step2:+新账户,选择 GitHub。

Step3:登录 GitHub 账号即可。


3. Create remote project

Step1:Xcode 创建一个新项目 GitTest

Step2:记得勾选 Source Control

Step3:现在我们点击左边第二个选项,可以看到 Source Control 的相关信息。

Step4:右键,选择 Create Remote on GitHub。

Step5:填写项目相关信息。

Step6:现在可以看到 Remote 这个选项里面有了我们刚才创建的 GitHub 项目。

Step7:右键可以直接 View GitHub Page。


4. Push Function

Step1:现在我添加一个新文件。

Step2:Source Control -> Commit

Step3:选择 Push to remote

Step4:Commit 完成。

Step5:到 GitHub 看一下,也马上有了相应的修改。

Step6:在 Xcode 也可以看到每次的修改内容(这个不需要用 GitHub 就可以实现,是 IDE 自带的功能)


5. Master and Branch

在项目开发中,我们会有Master(主线)和 Branch(分支)的概念。

打个比方,开发过程就像是种一棵树,一开始会有个Base(也就是我们的 Master,是最基本的一些框架和功能),然后我们会在 Master 的基础上不断的开发新功能,添加新模块;

但是如果我们单纯的在 Master 上面进行修改,很容易产生 Unstable 的版本(因为新功能通常要经历一定的时间才能达到稳定的状态)。

**为了保证我们的 Master 版本稳定,**一般在开发新功能的时候会基于 Master 创建一个 Branch,所有的功能添加都在 Branch 上面完成,如果测试 ok,我们再合并 Merge 到 Master 里面。

当一个 Branch 成功的合并进入 Master,这个 Branch 可以进行下一步的版本开发,或者直接 Delete,然后添加一个新的 Branch。

**用 Branch 的好处在于:**如果在开发的过程中发现遇到了问题,可以直接从上一个稳定的 Master 创建一个新的 Branch,然后继续开发(不用管有问题的 Branch)。

如果是团队合作,Merge 这件事一般是交给开发负责人来做的(因为 Merge 的时候要对比代码,还需要解决一些 Conflict,团队人多的时候很容易出各种 bug,就需要比较资深的人来做 Merge 的工作)。


6. Merge

我接下去讲的两种 Merge 方法,一种是适合个人开发(Local merge),另一种在 GitHub 的 Merge 就更适合多人合作开发的情况。

不管是哪种情况,我们的目标都是:保持本地和 web 的版本一致,让所有团队成员都能够基于最新的稳定版本进行开发。

Step1:右键 Master,选择创建 Branch。

Step2:注意,创建成功后会自动切到(checkout)新的 branch,现在开始所做的修改就是在新的 branch 里面,不影响 master 内容

Step3:想要切换到其他 branch,右键该 branch,选择 checkout(注意:current branch 必须全局 commit 才能切换到其他 branch,也就是之前提到的 Source Control-> commit)。

Step4:确认。

Step5:切回到 new-branch,创建一个新的文件。

Step6:单个文件 Commit,可以直接在这个文件右键(但是并不代表整个 project 都 commit 了)。

Step7:push 的时候一般选择 create new branch。

Step8:GitHub 的页面已经有了相应更新,并且提供版本 compare 和 merge(也就是 pull request)的功能。


7. Local Merge

在本地进行 branch 之间的 Merge,步骤如下:

Step1:在 branch->master 右键,选择 merge “new-branch” into “master”,就是把 new-branch 的内容合并到 master。

Step2:刚才提到,就算你只是 add 了一个 new file,其实除了这个 file 之外,其他的文件也有相应的自动修改,所以最好 commit 全局,而不是单个文件 commit。

Step3:commit 结束后,再次选择 merge。

Step4:这里可以看到修改 M 和添加 A 的内容。

Step5:本地 merge 结束后,不要忘记 push local change 到 remote 哦!!!(Source Control-> Push)

Step6:查看 GitHub 的 Master,已经和本地的 master 一样了。(注意:GitHub 里面之前创建的 new-branch 不会自动消失,需要手动删除。)


8. GitHub Merge

多人项目一定会涉及到 GitHub Merge,这里我们要知道如何进行 Merge 并且同步到本地。

Step1:我现在本地 create 了一个 new-branch2,然后添加了一个新文件 branchFile2,commit 并且 push 到 GitHub 的 new-branch2(create)。

Step2:借用之前的一张截图,在 branch 边上是可以选择 new pull request 的,也可以在 master 的页面上选择 pull request(相信大家都能找到)。

Step3:这里要选择 base 和 compare,翻译过来就是 merge new-branch2 into master,然后进行一系列的确认。

Step4:merge 完成后可以删除 branch,也可以撤回操作。

Step5:注意!本地的 branch 不会自动消失哦!!!

Step6:同步 GitHub 的 master 到本地(但是我这里没看仔细,其实我在 new-branch2 里面,应该先 checkout 到 master 在做 pull 的操作)

Note: Pull 就是把 GitHub 的内容同步到 local(拉下来),Push 就是把 local 的内容推上去(同步到 GitHub)。

Step7:拉下来的时候会让你选择拉哪个 branch,这里选择 master。

Step8:由于我刚才的错误操作,我的本地 master 并没有成功同步(当时我还没意识到发生了什么……)于是我选择了另一种同步方法,在 remote-origin-master 右键,直接 checkout。

Step9:然而我忘记先把本地的 master 删掉了= =

Step10:我又发现,current branch 是不能右键 delete 的,于是我“机智”的 checkout 到了另一个 branch。

Step11:总算能删掉这个【无辜的】master,然后 checkout remote master 了。

Note:其实 pull master 根本没这么麻烦= =只是我自己没有注意到 current branch 到底是哪个,还以为是 pull 的操作没有成功。

不过这种 delete master,remote checkout 的方法也可以作为……【备选方案】(强行解说)。


9. Invite Collaborators

基本操作介绍完毕!还有最最重要的一步哦!如果是 private repository 的话,你需要先邀请你的小伙伴加入这个项目,大家才能一起愉快的合作嘛~

步骤如下:

Step1:到 project->settings

Step2: 选择 collaborators。

Step3:找到你的队友,点击 add collaborator

Step4:漫长的等待(记得提醒队友查收邮件哦)。

Step5:搞定!开始写作业咯~


10. 结语

其实我觉得 GitHub 真的是一个特别棒的 Version Control 平台,而且也没有想象中那么难学对不对?

但是我了解下来,身边大部分 IT 小伙伴还是像我一样用传统的备份方式或者 GoogleDrive 备份……

所以希望这篇文章能给大家一些信心,慢慢上手 GitHub。

近看对自己的 Assignment 管理,远看对自己的职业发展,那都是绝对有好处的!

一起加油迎接 Week09 吧 :)