了解Git版本控制并学习如何在Xcode中使用它

每个人都会犯错,这是人类的一部分。 我敢肯定,每个读过这篇文章的人都会一次又一次在代码中犯了一个严重错误,并希望他们可以将项目恢复到一个小时前的方式。 像这样的错误就是为什么每个程序员都应该对所有项目都使用源代码控制。 不使用源代码控制与不备份计算机一样糟糕。 一次事故或数据丢失事件可能会损害您的整个项目。

源代码控制可帮助您返回项目的较早版本,以便您可以恢复丢失的数据或查看代码随时间的进度。 使用源代码管理时,与您的项目中的其他人进行协作也非常容易。 许多人会同意Git是最好的源代码控制形式,这对我们来说是幸运的,它是Xcode内置的!

常见的误解是GitHub和Git是同一件事。 这不是真的。 Git是在计算机上本地运行的源代码控制系统。 GitHub是一项在线服务,可让您将Git存储库存储在云中。 可以考虑使用iCloud Drive,但要提供代码,并具有更多功能。

随着Xcode 9的推出,Apple与GitHub合作,使开发人员可以轻松地在其应用程序中使用源代码控制。 在iOS项目中使用Git和GitHub不再需要使用命令行。 一切都内置在Xcode中!

在本教程中,我将向您展示Git的基础知识以及如何在Xcode中进行设置和使用。 我还将介绍如何连接您的GitHub帐户,以便您可以将代码存储在云中。

注意:本教程使用的功能仅在Xcode 9和更高版本中可用。 在继续操作之前,请确保Xcode是最新的。 在继续之前,您还应该在GitHub上拥有一个帐户。

由于我们在这里学习的是GitHub,而不是Swift,所以我使用的Xcode项目非常简单。 足以向您展示GitHub如何工作。 您可以在制作项目时继续学习,也可以随意使用自己的项目。 如果您使用自己的Xcode项目,请跳至How Git Works部分。

让我们开始一个项目! 打开Xcode,然后单击File and New Project 。 选择“ 单视图应用程序”,然后为您的项目命名。 我称其为Git Tutorial 。 将语言设置为Swift,我们将不需要此项目的核心数据,单元或UI测试。

现在这部分很重要! 在下一屏幕上,确保已选中“ 在Mac上创建Git存储库” 。 这将为您的项目目录初始化Git。 之后,点击创建 ,您就可以开始了!

因此,在继续使用GitHub和Xcode之前,让我们先谈谈Git的工作方式。

此图显示了Git存储库中文件可以处于的不同状态,以及可以在它们上使用的命令。

工作目录是您当前正在编辑文件的位置。 暂存区域是提交之前将文件添加到的区域。 此处的文件被视为“已暂存以提交”。 当您提交这些文件时,它们会被添加到本地存储库中。 当您进行推送时,您正在将本地存储库与远程存储库同步(在我们的情况下,今天将在GitHub上)。 进行推送将接受您在本地所做的任何更改,并将它们添加到远程存储库。 同样,进行拉取将对远程存储库进行任何更改,并将它们添加到本地存储库中。

假设您和一些朋友正在开发一个简单的待办事项清单应用程序。 它分为三页: 待办事项完成页面和设置页面 。 假设您今天只想在“设置”页面上工作。 首先,您将从远程存储库中提取信息以确保您对队友进行了任何更改。 现在,当您开始处理设置页面的代码时,它位于您的工作目录中。 完成设置页面或其他重要部分的功能后,您可以git addgit add到暂存中。 如果添加了任何新文件或图像,则也将它们添加到暂存中。 现在您准备好进行提交。 进行提交时,您会添加关于更改内容的评论。 最后,使用git push将本地存储库与远程存储库同步。 您希望您的队友拉一下,以便他们对设置页面进行更改。

看起来似乎很混乱,但是实际上非常简单! 本教程的其余部分将使它更易于理解。

因此,让我们谈谈一些Git命令:

  • git init :这将初始化Git的项目目录。 Xcode将为您完成此任务。 但是,如果您曾经在命令行中使用Git,则需要使用它。
  • git status :您可能会猜到,它显示git仓库的状态。 在您的命令行中,未跟踪(不在暂存中)的文件将显示为红色,而已跟踪(在暂存中)的文件将显示为绿色。 Xcode在“项目浏览器”中显示文件的状态,稍后我们将介绍。
  • git add :这会将您的文件添加到暂存中。 在Xcode中,将文件添加到提交中所需要做的就是将其选中,稍后我们将介绍它们。
  • git commit :这会将您的文件提交到本地存储库中。
  • git push :这会将您的更改推送到远程存储库(GitHub)。
  • git pull :这将从远程存储库中提取更改。 如果您正在与队友一起进行项目,则将使用pull将他们的更改与存储库同步。

这些是基础。 让我们开始吧!

因此,如果在创建项目时单击“ 创建Git存储库”框,则Xcode已经为您进行了首次提交! 如果未选中该框,请单击菜单栏中的源代码管理 ,然后单击创建git存储库以初始化项目的存储库。 菜单栏中的源代码管理选项卡应如下所示:

现在,我们进行一些更改,以便我们可以再次提交! 在项目导航器中转到ViewController.swift并添加任何有效代码! 我添加了一个字符串常量,并将其打印在ViewDidLoad方法中。

打开版本编辑器后,您将看到两列代码,其中高亮显示了它们之间的差异。 左列是您正在处理的当前文件。 正确的文件是同一文件,但是最后一次提交到本地git存储库时。 这真的很强大! 这样,您可以查看自上次提交以来更改的每一行。 如果此后停止正常工作,则可以轻松找到它。

您可以在这里确切地看到我添加和删除的内容。 还有另一种方法可以查看自上次提交以来哪些文件已更改。 在您的项目导航器中查看:

看到ViewController.swift文件旁边的那个小M吗? 这表示已修改 ,这意味着自我上次提交以来,ViewController文件已更改。 如果看到A ,则表示已添加文件。 这是跟踪文件和存储库的另一种好方法。

现在,既然我们知道发生了什么变化,那么让我们提交更改。 在菜单栏中,单击“ 源代码管理” ,然后单击“ 提交” 。 您现在应该看到以下内容:

这是提交窗口,它使您可以将文件添加到暂存并一次提交所有文件。 如您所见,这里的版本编辑器也在左侧显示您的本地修订,在最后一次提交时显示文件的状态。

现在看一下左侧的文件列表。 这些是自上次提交以来已更改的所有文件。 您可以单击这些,然后查看有什么新功能可以帮助您提出良好的提交消息。 您还将注意到所有文件旁边都有一个复选框。 这是git add的 Xcode版本 仅选中的文件将被提交。

说到提交消息,请查看窗口底部的文本框。 这是写的地方。 良好的提交信息简短,甜美,并能说明所做的更改。 编写此代码是为了:1)您的队友知道您要提交的内容,以及2)您可以回头查看日志,看看您加班后进行了哪些更改。 如果您发现了错误,那么良好的提交消息可以使您轻松跟踪其创建时间和位置。

现在,输入有关您所做更改的消息,然后单击commit#file(s)

让我们分支出去,谈论分支。 那么什么是分支? 它基本上是一个独立的迷你存储库,通常专注于一项功能。 很好的是,它与团队成员的所有工作无关。 这意味着,如果您在分支中弄乱了某些内容,则不会弄乱项目中的所有其他代码。

让我们回到之前的待办事项清单应用示例。 假设您要添加一项新功能,该功能允许用户将任务同步到其iCloud日历。 您可以从master分支创建一个名为“ calendar”的分支。 master分支是我们在本教程中一直致力于的默认分支。

新的“ calendar”分支具有项目中的所有代码,但您可以独立进行处理。 当您提交更改时,您将提交到日历分支而不是主分支。 完成日历同步功能的编程后,它可以正常工作,您可以将其合并回master分支。 但是说您的团队决定放弃日历功能,您只需删除分支就不会造成任何伤害。 使用分支是一种向您的应用程序添加功能的更有条理的方法,并且由于更加容易无意间弄乱整个项目,因此更加安全。

为了演示,让我们向我们的小型练习应用程序添加一个新函数,该函数只需在参数中输入一个字符串,然后将其取反然后返回即可。 我们将在另一个分支中创建函数。

首先,转到“源代码管理导航器”。 我们将在这里花费很多时间。 它是左上方项目导航器旁边的标签。

如果展开该文件夹,则将看到另外三个文件夹: BranchsTagsRemote 。 展开“ 分支”文件夹,您将看到主分支。 右键单击master分支,然后单击“ 从Master分支”。

现在是时候给您的新分支取一个名字了。 我将命名为“ reverse”,因为我正在使用它添加反向功能。

现在,您将在branchs文件夹中看到新的分支。 旁边还会有(当前) 。 这是因为您已切换到该新分支。 除非您签出另一个分支,否则所有提交都将进入新分支。

现在,我们添加reverse函数并将其放置在viewDidLoad之后:

您会注意到,它现在表明我们正在反向分支中工作。 编写提交消息并提交。

现在,我们已经完成添加新功能,并且效果很好。 现在是时候将其合并回master分支了! 返回到“源代码管理导航器”并进入branchs目录。 右键单击master分支。

让我在这里解释一些选项:

  • 签出,从顶部开始的第三个选项 :在Git中,签出意味着切换分支。 假设我要在master分支中处理另一个功能。 然后,我将结帐主人,并做我需要做的事情。 当我想继续进行反向操作时,我签出反向分支并继续工作。
  • 将“ master”合并到“ reverse” :这会将master分支合并到反向分支。 我们不想这样做! 这将从“ master”获取所有代码,然后将其放入“ reverse”。 将master与另一个分支合并通常是一个坏主意。
  • 将“反向”合并为“主” :这就是我们要做的。 这将从“ reverse”中获取所有代码,并将其放入“ master”中,因此将反向功能添加到项目中。 单击此选项,然后单击合并

现在,您将看到版本编辑器,其中显示了您的本地修订版和master的上一次提交。 再单击一次左下方的合并

现在您将看到合并记录在提交日志中,并且master是当前分支。 恭喜你! 您创建的第一个分支添加了功能,然后将其合并!

现在,让我们进入真正的好东西:连接到您的GitHub帐户! 因此,在继续之前,请确保已设置GitHub帐户。

首先,让我们连接您的帐户。 转到您的Xcode偏好设置(菜单栏> Xcode>偏好设置),然后转到帐户标签。 单击左下方的加号,然后选择GitHub选项并继续。 输入您的GitHub用户名,密码和中提琴! 您已成功连接GitHub帐户!

现在让我们在GitHub中为该项目创建一个存储库。 在Source Control Navigator中,右键单击带有项目名称的文件夹,然后单击“在GitHub上创建GitTutorial远程”。

现在,您应该看到一个窗口,可用于设置存储库。 确保已选择您的帐户。 为您的存储库设置一个名称(默认名称是您的项目名称)并添加一个可选的项目描述。 在这里,您还可以选择存储库是公共存储库还是私有存储库(私有存储库仅适用于GitHub会员或学生付费)。当所有设置都正确时,单击create

现在转到您的GitHub帐户并转到您的存储库(单击右上角的个人资料图片>您的个人资料>存储库)。 您应该看到您的项目在顶部列出。

单击它,您现在可以看到您的存储库页面。 您还可以查看项目的描述,提交的次数,当然还有项目的所有文件。 很酷,您能够通过Xcode完成所有这些工作,对不对?

因此,现在让我们进行其他更改,但是这次我们提交后将更改推送到GitHub。

我要在情节提要中添加一个标签,并在ViewController中为该标签添加一个插座。 使用反向功能后,我还将将该字符串打印到标签上。

这是我现在所拥有的:

注意:不要忘记将插座连接到情节提要板上的标签。

这是我们第一次在此项目的故事板上进行更改。 请注意, ViewController.swift文件和情节ViewController.swift文件旁边都有一个M。 另外,打开版本编辑器,然后单击情节提要。 故事板文件实际上是XML文件,因此版本编辑器也可以与故事板文件一起使用,向您显示更改。

现在,转到源代码管理选项卡,然后执行另一次提交。 这次在提交窗口上,您将同时看到ViewController文件和情节提要文件。 确保对它们都进行了检查,以使它们都得到落实。

现在,您已经提交了更改,让我们将其推送到GitHub! 再次转到“源代码管理”选项卡,但这一次单击“ 推送” 。 在弹出窗口中选择master分支,然后再次单击push

推送完成后,“ 成功推送”将显示一个绿色的对勾。 现在转到您的GitHub帐户并查看您的存储库。 您应该在受更新时间影响的文件旁边看到提交消息。

恭喜你! 您已经完成了对Xcode的首次推送!

如果您正在与队友一起进行项目,那么您将需要知道如何做到。 因此,假设您的一个克隆您的存储库的队友对ViewController进行了更改。 他们将进行更改,提交更改并将其推送到存储库。 现在,当然,您将需要在本地存储库中进行这些更改。 因此,您将需要拉。

为了演示,我在GitHub存储中创建了一个名为FileToPull的新文件。 当然,您很可能会提取新的或更新的代码文件。

要进行拉取,请进入菜单栏中的“源代码控制”选项卡,然后单击“ 拉取” 。 对于这种情况,请选择master分支,然后再次单击pull

自从我拉出一个新文件以来,拉取成功,并且该文件现在位于我的项目导航器中:

但是,假设您要提取已拥有文件的更新版本。 这是Xcode内置的源代码控制功能真正派上用场的地方。 在这种情况下,将显示版本编辑器,其中显示了您的文件版本以及您将要提取的版本。 这样,您可以查看队友在拉动之前所做的所有更改。 您可以接受拉取并将所有更改同步到文件中,甚至可以选择某些更改来拉取。

我希望本教程可以帮助您进入Git和GitHub的惊人世界。 版本控制是用于项目的如此重要且有用的工具,我可以向您保证,您从事的任何编程工作都将大量使用它。

如果您发现本教程的任何部分令人困惑或有任何疑问,请随时在下面留下评论,我将为您提供帮助! 有关如何使用GitHub的更多信息,请查看GitHub指南。

在GitHub上玩得开心,并记住,如果发生火灾,请执行git commit,git push和git out!


关于作者:
Mitchell Sweet自2013年以来一直是iOS开发人员。他热爱用户界面设计,并在App Store上拥有12个应用程序。 他还于2016年和2017年两次获得WWDC的奖学金得主。目前,米切尔就读于罗彻斯特理工学院。 他喜欢教别人有关iOS应用程序开发的知识,并希望他的教程可以为世界各地的开发人员提供帮助。 您可以在LinkedIn上与他联系或在Github上关注他。

该文章首先在AppCoda.com上发布。


在社交媒体平台上关注我们:
面子书:facebook.com/AppCodamobile/
Twitter:twitter.com/AppCodaMobile
Instagram的:instagram.com/AppCodadotcom

如果您喜欢这篇文章,请单击👏按钮并分享以帮助其他人找到它! 随时在下面发表评论。