iOS 开发者的 Git 基础知识

185 阅读15分钟

我马上就说这个。不存在“针对 iOS 开发人员”的 git 之类的东西。然而,作为 iOS 开发人员,我们确实使用 git。这意味着了解 git、它是什么、不是什么以及最重要的是我们如何在工作中有效且高效地使用它非常有意义。

在这篇文章中,我想概述作为使用 git 的 iOS 开发人员需要了解的一些关键概念、命令和原则。读完这篇文章后,您将对 git 的基础知识有很好的了解,并且准备好开始深入研究更高级的概念。

了解 git 是什么

Git 是一个所谓的版本控制系统,发明于 2000 年代初期。它是由 Linus Torvalds 发明的,他也是 Linux 操作系统的创建者。它的主要目标是成为 SVN 和 CVS 等旧版本控制系统的更快替代品。这些旧系统都依赖于单一事实来源,并且使得分支等功能变得缓慢且难以管理。由于每个人都依赖单一事实来源,这意味着也存在单点故障。实际上,这意味着如果您的服务器崩溃了,整个项目就会崩溃。

Git 是一个分布式系统。这意味着克隆项目的每个人都会克隆整个 git 存储库。当每个人克隆存储库时,他们的机器上都拥有所有代码、所有分支、所有标签等。

这样做的好处是,如果存储库的任何副本出现问题,总是可以替换该副本,因为永远不会出现单点故障。

然而,在您的日常使用中,git 比之前的版本更快、更可靠并不重要。在日常工作中,您很可能会使用 git 作为与同事协作的一种方式,并确保您始终拥有一个具有正确的项目历史记录跟踪的备份。

新开发人员中的一个常见误解是,只有当项目需要在多个开发人员之间共享时,git 才有意义。虽然它对此非常有用,但我只能建议您也始终使用 git 来管理您的个人项目。这样做将允许您在单独的分支中试验新功能,将项目回退到之前的时间点,并标记版本,以便您始终知道最终发布的代码版本。如果您不确定什么是分支,请不要担心。我很快就会解释这一点。

无论项目规模、团队规模或项目复杂程度如何,始终建议使用 git。

在这篇文章中,我不会解释 git 是如何在这里面工作的。我的目标是目前提供更高层次的概述,并在几个后续帖子中深入研究内部结构。Git 本身就已经足够复杂了,所以没有必要让事情变得比介绍性文章中所需要的更复杂。

现在您已经知道 git 是一个版本控制系统,允许您跟踪代码、共享代码、创建分支、标签等,让我们看一下使用 git 时使用的一些术语。

关键术语

您对 git是什么有一个模糊的认识,所以现在我想向您介绍一些关键术语。这将帮助您进一步理解本系列中概念的解释,并让您初步了解最重要的 git 概念。

在这篇文章的后面,我们还将了解 git 的一些最重要的命令,这些命令将开始将内容置于上下文中,并为您提供一些开始使用 git 的指导(如果您还没有使用 git)。

************** ******存储库 ********************

当您使用 git 时,项目通常称为存储库。您的存储库通常是项目文件夹,其中包含.git初始化 git 存储库时创建的文件夹。该文件夹包含有关您的项目、提交、历史记录、分支、标签等的所有信息。在本文的下一部分中,我们将介绍如何创建新的 git 存储库。

远程( ********** **原点) ************

git 存储库通常不仅仅存在于您的计算机上(尽管它可以!)。大多数存储库都托管在服务器上的某个位置,以便您可以从任何计算机轻松访问它,并与您的团队成员共享存储库。虽然它是分散的,并且克隆您的存储库的每个人都拥有该存储库的完整副本,但您通常会拥有一个单一来源,该来源被用作您团队中的每个人都将代码推送到其中并从中提取更新的事实来源。

大多数项目将使用 GitHub、GitLab 或 Azure 等现有平台作为远程推送和拉取代码。如果需要,一个项目可以使用多个遥控器,但通常您的主要/主遥控器称为“origin”。

************ ****分支 ****************

在 git 中,您可以使用分支来构建您的工作。您使用 git 进行版本控制的每个项目都将至少有一个分支,该分支通常称为main. 每次您在存储库中进行新的提交时,您实际上都会将该提交与分支相关联。这允许您创建一个基于给定版本的代码的新分支,对其进行处理、进行更改,并最终切换回不包含您刚刚所做的相同更改的另一个分支。

在某种程度上,您可以将 git 中的分支视为提交链。

当您在为应用程序开发新功能的同时还维护应用程序的发布版本时,这非常有用。您可以在 git 中创建任意数量的分支,并且当您对刚刚构建的功能感到满意时,可以将更改合并回主分支。

********** **** 提交 **************

我认为提交是 git 的核心功能。每次进行新的提交时,您都会创建迄今为止在项目中所做工作的快照。提交后,您可以选择继续处理您的项目、在新功能方面取得进展、实施错误修复等。随着您取得进展,您将做出越来越多的提交来记录您的进展。

那么你为什么要做出提交呢?

嗯,有几个关键原因。其中之一是提交允许您查看从一个步骤到下一步所做的更改。例如,当您完成大型重构时,您可能无法完全记住您处理过哪些文件以及更改了哪些内容。如果您在重构过程中进行了一次或多次提交,您可以追溯重构过程中采取的每一步。

进行提交的另一个原因是,您可以从该提交中分支出来,单独处理不同的功能。最常见的是在团队中执行此操作,但我也在单人项目中执行此操作。

Git 就是关于提交的,所以如果你是 git 新手,那么如果有一个 git 概念是你首先要关注的,那么它很可能就是提交。

************************合并和变基 **********************

现在,我将讨论单个标头下的合并和变基。它们都是不同的概念,具有截然不同的含义和工作流程,但它们通常具有相似的目的。由于我们专注于介绍主题,因此我认为在单个标题下讨论合并和变基是公平的。

当我们在一个分支上有一系列提交,并且另一个分支有更多提交时,我们通常希望以某种方式将较新的提交引入到我们的源分支中。例如,如果我有一个一直致力于的主分支,我可能会创建一个特定于功能的分支来工作。例如,我可能已经从主分支中分支出来,开始对我的应用程序进行设计检修。

一旦我的设计大修完成,我将想要使用新设计更新我的主分支,以便我可以将此更新发送给我的用户。我可以通过变基或合并来做到这一点。任一操作的最终结果都是我所做的提交(或功能分支的最终状态)最终被应用到我的主分支。合并和变基各自以稍微不同的方式执行此操作,我将在后续帖子中更深入地介绍每个选项。

Git 最重要的命令

好吧,我知道这是一篇很长的文章(尤其是对于博客来说),但在我们结束 git 的介绍之前,我认为我们是时候回顾一下 git 的一些关键命令了。这些命令对应于我们刚刚介绍的关键术语,因此希望这些命令及其解释有助于巩固您刚刚学到的知识。

因为命令行是 git 的通用接口,所以我将继续将我的示例仅集中于在命令行中运行命令。如果您更喜欢使用图形化界面,请随意使用您喜欢的界面。Fork、Tower 和 Xcode 的内置 git GUI 都工作得很好,并且都构建在下面概述的命令之上。

初始化新存储库

当您开始一个新项目时,您会希望尽早为您的项目创建一个 git 存储库。.git创建存储库可以通过在项目根目录中创建文件夹的单个命令来完成。正如您在上一节中了解到的,.git文件夹是存储库的核心和灵魂。它将文件系统上的普通文件夹转换为存储库。

要将项目文件夹转换为存储库,请导航到项目文件夹(项目的根目录,通常与您所在的文件夹相同.xcodeproj)并键入以下命令:

git init

此命令将快速运行,并将在您运行该命令的文件夹中初始化一个新存储库。

在 Xcode 中创建新项目时,您可以选中“在我的 mac 上创建 git 存储库”复选框,以将项目作为 git 存储库启动。这将允许您跳过 git init 步骤。

为您的项目创建存储库尚未将项目中的任何文件置于版本控制之下。我们可以通过运行git status命令来验证这一点。对我刚刚在其中创建新 Xcode 项目的文件夹执行此操作会产生以下输出:

解释
❯ git status
On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
    GitSampleProject.xcodeproj/
    GitSampleProject/

nothing added to commit but untracked files present (use "git add" to track)

**************如您所见, **** ************未跟踪文件 ****************** ************标题下有一个文件列表。

这告诉我们 git 可以看到我们的项目文件夹中有文件,但 git 不会主动跟踪(或忽略)这些文件。在这种情况下,git 会看到我们的xcodeproj文件夹和GitSampleProject保存 Swift 文件的文件夹。Git 不会主动深入这些文件夹来列出它未跟踪的所有文件。相反,它列出了文件夹,表明该文件夹中没有任何内容正在被跟踪。

接下来让我们看一下向 git 添加文件。

添加文件到git

正如您所看到的,git 不会自动跟踪项目文件夹中每个文件的历史记录。为了制作 git track 文件,我们需要使用add命令将它们添加到 git 中。当您将文件添加到 git 时,git 将允许您提交该文件的版本,以便您可以跟踪历史记录或在需要时返回到该文件的特定版本。

将文件添加到 git 的最快方法是使用add以下命令:

git add .

虽然这种方法很快,但效果并不好。在标准 Xcode 项目中,总会有一些您不想添加到 git 的文件。我们可以通过指定要添加的文件和文件夹来更具体地了解需要添加到 git 的内容:

解释
# adding files
git add Sources/Sample.swift

# adding folders
git add Sources/

对于标准 Xcode 项目,我们通常需要项目文件夹中的所有内容,但有几个例外。我们可以使用名为 .gitignore 的文件从 git 中排除文件和文件夹,而不是每次要进行新提交时手动键入和过滤要添加到 git 的文件和文件夹.gitignore。您可以将多个忽略文件添加到存储库,但最常见的是,您的项目根目录下会有一个。.gitignore您可以通过键入以下命令在命令行上创建文件:

❯ touch .gitignore
❯ open .gitignore

这将在文本编辑应用程序中打开您的文件。一个典型的 iOS 项目至少会在该文件中添加以下文件和文件夹:

.DS_Store
xcuserdata/

如果您愿意,可以使用模式匹配来排除或包含使用通配符的文件和文件夹。现在,我们仅使用一个非常简单的忽略文件作为示例。

从现在开始,每当 git 看到您的项目中有与忽略文件中的模式匹配的文件和文件夹时,它不会告诉您它没有跟踪这些文件,因为它只会忽略它们。这对于包含用户特定数据的文件或构建时生成的内容非常有用。例如,如果您使用类似Sourcery在每次构建时在项目中生成代码之类的工具,您通常会从 git 中排除这些文件,因为它们无论如何都会自动重新创建。

使用 将文件添加到 git 后git add,它们就会添加到暂存区域。这意味着如果您现在要进行提交,这些文件将包含在您的提交中。在您提交之前,Git 不会记录文件的永久快照。当您进行提交时,只有添加到暂存区域的更改才会包含在提交中。

为了进行初始提交,您通常会设置文件.gitignore,然后运行git add .将项目中的所有内容一次性添加到暂存区域。

要查看已更改的文件、未跟踪的文件以及位于暂存区域并准备好提交的文件的当前状态,我们可以git status再次使用。如果我们在添加一些文件并创建文件后运行 iOS 项目的命令,.gitignore我们会得到以下输出:

解释
 git status
On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
    new file:   .gitignore
    new file:   GitSampleProject.xcodeproj/project.pbxproj
    new file:   GitSampleProject.xcodeproj/project.xcworkspace/contents.xcworkspacedata
    new file:   GitSampleProject.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
    new file:   GitSampleProject/Assets.xcassets/AccentColor.colorset/Contents.json
    new file:   GitSampleProject/Assets.xcassets/AppIcon.appiconset/Contents.json
    new file:   GitSampleProject/Assets.xcassets/Contents.json
    new file:   GitSampleProject/ContentView.swift
    new file:   GitSampleProject/GitSampleProjectApp.swift
    new file:   GitSampleProject/Preview Content/Preview Assets.xcassets/Contents.json

这正是我们想要的。不再有未跟踪的文件,git 已找到我们的忽略文件,我们准备告诉 git 通过提交来记录我们存储库的第一个快照。

进行你的第一次提交

我们可以通过写入“Youd”来进行新的提交,并将和git commit -m "<A short description of changes>"之间的文本替换为描述快照中内容的短消息。在初次提交的情况下,您经常会编写. 未来的提交通常包含一个非常短的句子来描述您所做的更改。<``>``initial commit

编写描述性但简短的提交消息是一种非常好的做法,因为一旦您的项目已经开发了一段时间,当您的提交消息比“做了一些工作”或类似的东西更具描述性时,您会感谢自己。

回到我们的第一次提交。要在示例存储库中进行新提交,我运行以下命令:

git commit -m "initial commit"

当我运行此命令时,会产生以下输出:

解释
[main (root-commit) 5aa14e7] initial commit
 10 files changed, 443 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 GitSampleProject.xcodeproj/project.pbxproj
 create mode 100644 GitSampleProject.xcodeproj/project.xcworkspace/contents.xcworkspacedata
 create mode 100644 GitSampleProject.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
 create mode 100644 GitSampleProject/Assets.xcassets/AccentColor.colorset/Contents.json
 create mode 100644 GitSampleProject/Assets.xcassets/AppIcon.appiconset/Contents.json
 create mode 100644 GitSampleProject/Assets.xcassets/Contents.json
 create mode 100644 GitSampleProject/ContentView.swift
 create mode 100644 GitSampleProject/GitSampleProjectApp.swift
 create mode 100644 GitSampleProject/Preview Content/Preview Assets.xcassets/Contents.json

这告诉我,使用哈希值创建了一个新的提交5aa14e7。该哈希值是本次提交的唯一标识符。Git 还告诉我提交中的文件数量和更改,然后列出文件。在这种情况下,我的所有文件都带有create mode. 当我对文件进行更改并提交这些更改时,标签将相应更改。

大多数 git 存储库都连接到 GitHub 等远程主机。在这篇文章中,我不会向您展示如何将远程添加到 git 存储库。这篇文章已经相当长了,所以我们将在单独的文章中介绍 git 和远程主机。

总之

在这篇文章中,您学习了许多有关 git 的基础知识。现在你知道了 git 是一个所谓的版本控制系统。这意味着 git 会跟踪文件的历史记录,并允许我们使用分支同时处理多个功能和错误修复。您知道 git 存储库包含一个.git文件夹,其中保存了 git 操作所需的所有信息。

我已经解释了 git 最重要的术语,如提交、分支、合并等等。我们已经研究了这里的关键概念,这意味着对于您所看到的一些术语,我们可以更深入并发现许多有趣的细节。这些都是单独帖子的主题。

在介绍了 git 中最重要的术语之后,我们了解了 git 中最重要的命令。您已经了解了如何创建新的 git 存储库、如何添加和忽略文件以及如何进行提交。