什么是Git——协作式编程的版本控制

244 阅读11分钟

什么是Git?协作式编程的版本控制

为Linux内核开发而发明的Git版本控制,现在为全球数百万项目提供支持。无论是否有GitHub,你都可以使用它。

Git是一个主要由计算机程序员用于协作的软件平台。其核心是,Git跟踪文件的变化,并允许多个用户协调这些文件的更新。Git最常见的用途是开发人员处理源代码文件,但它也可以用来管理任何类型文件的更新。

Git也是GitHub和其他源代码管理系统的版本控制标准,它被广泛用于devops内部以实现CI/CD。对于在Kubernetes或其他云原生平台上部署和管理其应用程序的开发者,GitOps提供了与容器化集群和应用程序合作的最佳实践。

Git是一种编程语言吗?

Git不是一种编程语言,但对于使用几乎所有你能想到的语言的计算机程序员来说,它已经变得无比重要。今天,Git是所谓的版本控制软件事实标准。程序员使用版本控制来跟踪大型代码库的更新,在需要时回滚到早期版本,并查看所做的任何修改,以及谁做了这些修改。它已经成为敏捷软件开发的一个组成部分,也是GitOps的一个核心功能,它将敏捷开发理念延伸到基于容器的系统。

为什么它叫Git?

Git 的名字与它的历史密切相关。Git是由一个你几乎肯定知道其名字的人创建的。Linus Torvalds,Linux的创造者。Git 创建于 2005 年,是为了帮助管理 Linux 内核的开发。Torvalds当时对许多其他的版本控制系统感到不满,而BitKeeper,被一些内核开发者所青睐,但并不开源。(像Git这样无处不在的软件平台只是他的第二大名声,这证明了Torvalds对计算机的影响)。

当最早的Git版本推出时,Torvalds厚颜无耻地对它的名字提出了各种解释。最有可能的解释是,Git是一个三个字母的组合,容易发音,而且还没有被其他Unix命令所使用。这个词听起来也像get-relevant,因为你可以用Git来从服务器上获取源代码。git这个词在英式英语中也是一个温和的辱骂用语--如果你对某些软件发火的话,就与此有关。Torvalds补充说,如果你心情好,你可以说它是 "全球信息跟踪器 "的缩写,如果你心情不好,你可以说它是 "该死的白痴卡车[这里的粗鲁词汇]"的缩写。

谁拥有Git?

如前所述,Git 是作为现有版本控制软件的一个开放源码的替代品,这意味着没有一个人或实体控制它。在创建几个月后,Torvalds把维护工作交给了Junio Hamano,他一直是这个项目的主要贡献者。现在在谷歌工作的Hamano仍然是Git的核心维护者。

Git vs. GitHub

Git 提供了分布式的版本控制功能。你可以用Git来管理你自己在电脑上的编码工作,但它更多地被用于多人在多台电脑上的协作。在这样的项目中,源代码的标准版本存在于某个服务器上--用Git的话说就是中央仓库,各个用户可以从该仓库上传和下载更新。

Git允许你用自己的电脑作为其他人的中央仓库,或者在其他地方建立一个,但也有许多服务提供商提供商业的Git托管服务。GitHub成立于2008年,于2018年被微软收购,是迄今为止最著名的,它不仅提供托管服务,还提供各种其他功能。你可以从InfoWorld了解更多关于GitHub的信息,但目前需要记住的是,虽然GitHub是围绕着用Git开发的,但你不需要用GitHub来使用Git。

用Git进行版本控制

我们已经介绍了一些基础知识,现在让我们更详细地了解 Git 是如何工作的,以及它为什么如此受欢迎。一个完整的 Git 教程超出了本文的范围,但我们可以研究一下最重要的 Git 概念和术语,以帮助你入门。

Git 仓库

我们已经触及到了仓库的概念。仓库是一个概念性的空间,你的项目的所有部分都在这里。如果你是一个人在做项目,你可能只需要一个仓库,而在一个合作项目中,你可能会从一个中央仓库工作。中央仓库将被托管在一个服务器或像GitHub这样的中央供应商上,而每个开发者也会在自己的电脑上拥有自己的仓库。(我们稍后会讨论如何将所有这些仓库中的代码文件正确地同步起来)。

一个 Git 仓库被细分为两个区域。一个是暂存区,你可以在那里添加和删除组成项目的文件,另一个是提交历史。提交是 Git 工作的核心,所以我们接下来讨论它。

Git 提交

提交可以被认为是你的项目在某一特定时刻的快照。一旦你对放置在暂存区的文件感到满意,你就会发布git commit 命令,将这些文件的当前状态及时冻结。你可以进一步修改和提交,但你总是能够恢复到之前的提交。你也可以通过比较两个提交来快速了解项目中的变化。

需要注意的是,创建提交与将代码投入生产是两回事。提交可以为你的应用程序创建一个版本,你可以测试、试验,等等。开发团队可以通过提交快速迭代,作为让应用程序进入生产准备状态的过程的一部分。

Git储藏室

尽管提交可以被撤销,但它们确实代表了一定程度的,嗯,承诺。如果你正在处理暂存区域的文件,并想继续做其他事情,而不提交你的修改,你可以使用git stash 命令来保存它们,以便以后使用。

Git 分支和 git 合并

到目前为止,你可能会把提交想象成代码随时间演变的一系列线性快照。但是,Git的一个真正酷和强大的方面是,你可以用它来并行处理不同版本的应用程序,这对敏捷的软件开发至关重要。

为了理解 Git 分支和合并的实践,想象一下你有一个叫做 CoolApp 的应用程序,其版本是 1.0。你正在稳定地开发 CoolApp 2.0,有各种有趣的新功能,你正在以一系列提交的形式在仓库中开发。但后来你发现CoolApp 1.0有一个严重的安全缺陷,需要马上打补丁。你可以回到CoolApp 1.0的提交,打上补丁,然后把代码作为CoolApp 1.1发送到生产中,而不会干扰或增加导致CoolApp 2.0的一系列提交,这些提交仍然以1.0为父版本。现在,1.1和2.0版本被认为是在代码库的不同分支上。因为1.1版本在生产中,而2.0版本在开发中,所以我们称1.1为主 分支

一旦CoolApp 2.0准备好了,你需要把它的新代码和功能与1.1版本的安全更新结合起来。这个过程被称为合并两个分支,是 Git 魔法的一个关键部分。Git 试图从两个不同的 "父分支 "中创建一个新的提交,也就是说,两个分支的最新提交。它创建新的提交时,会比较它的前辈,直到两个分支分离的地方,然后将两个分支上的所有修改合并到新的、合并的提交。如果某些信息--比如说特定的代码块--在两个分支中以不同的方式被修改,Git 会把哪个版本属于新提交的问题推给开发者。

Git 签出

许多大型项目都有多个正在开发的分支,而且是并行的。git checkout 命令是改变你正在工作的分支的方式。这个过程会将工作目录中的文件更新为你感兴趣的那个分支的最新版本;然后你所有的新提交都会提交到该分支上,直到你签出另一个分支。

使用 Git 进行协作

到目前为止,我们一直在讨论 Git 仓库中发生的事情,就好像你是唯一在其中工作的人。但是,Git 是最著名的协作工具。接下来,我们将看看Git的概念在协作背景下是如何工作的。

Git 克隆

在一个项目中开始与他人协作的最简单方法是克隆另一台电脑上已经存在的仓库。克隆会将该仓库的全部内容下载到你自己机器上的仓库。

我们已经讨论过中央版本库的概念。对于项目来说,把托管在 GitHub 或其他地方的版本库作为项目代码库的典型 "真理之源 "是非常普遍的。让我们在本文的剩余部分假设这样一种安排。然而,请注意,哪个仓库是中心仓库的问题是由项目参与者商定的,并不是由Git本身强制执行的。理论上,你可以让不同的仓库交换代码,而没有一个仓库是中心仓库。

Git pull 和 Git push

我们已经讨论过 Git 是如何协调同一台机器上的两个提交分支的。对于不同机器上的两个分支,它也可以使用基本相同的技术来做同样的事情。在机器之间移动一个分支的过程被称为pullpush,这取决于它的启动方式。如果你把一个分支从远程服务器带到你的机器上,你就是拉。如果你把一个分支从你的机器发送到另一台机器上,你就是推送。

Git 拉取请求

把你的代码推送到另一台机器上--或者推送到整个项目所依赖的中央仓库上--可能看起来有点,嗯,很急。更常见的情况是拉取请求,这也是 Git 协作性的关键。比方说,你已经完成了一个新功能的代码,并希望将其整合到项目的代码库中。你可以发布一个拉取请求,正式要求项目经理把你的新代码拉到中央仓库。

拉取请求不仅让项目经理有机会接受或拒绝你的贡献,它还在中央仓库创建了一个小型讨论论坛,所有项目成员都可以在论坛上发表意见。这是开发人员对项目代码库进行修改的一个重要方式,尤其是在开源项目中,Git可能是贡献者互动的主要场所。

Git分叉

分支是为了暂时脱离主代码库,最终会被合并回主代码库。另一方面,分叉则是一种更永久的脱离。特别是对于开源项目来说,当一个开发者决定采用现有的开源代码库并为自己的目标进行开发时,就会发生分叉,而这些目标可能与项目当前的维护者不同。GitHub 使得从现有的 Git 仓库分叉变得特别容易;只需点击一下,你就可以克隆一个现有的仓库并开始按照自己的方式工作。

Windows下的Git

如前所述,Git 最初是为 Linux 内核开发而开发的,它采用了一系列命令行工具的形式。它的结构和命令语法在很大程度上是基于 Unix 的,这意味着它或多或少能在类似 Unix 的操作系统上运行,比如 Linux 和 macOS。将Git移植到Windows上就比较麻烦了,需要依靠Git bash,一个内置于Gitfor Windows的Bourne shell仿真器。

GUI和IDE的整合

当然,很多 Windows 开发者都习惯于使用 GUI,因此 Windows 版的 Git 也包含了一个图形化的用户界面。macOS 和 Linux 的用户也不应该感到被抛弃:有很多 GUI 可以使用。跨平台的 GUI 也是存在的,并提供了各种功能和口哨。