什么是 Git

✍️ houkensjtu | 童仲毅

©️ 本文演绎自 Atlassian 编写的 What is Git。页面上所有内容采用知识共享-署名(CC BY 2.5 AU)许可协议。

到目前为止,Git 是世界上使用最为广泛的现代化版本控制系统。Git 最初由 Linux 系统内核的作者 Linus Torvalds 在 2005 年开始开发,目前已经是一个持续维护的成熟开源项目。如今,大量软件项目依赖 Git 进行版本管理,其中既有开源软件,也有商业软件。Git 在很多操作系统和集成开发环境(IDE)上都表现良好。绝大多数软件开发者或多或少都使用过 Git。

Git 是分布式版本管理(DVCS)的一种。CVS 和 Subversion(SVN) 等集中式的版本管理软件将完整的版本历史存放在同一个地方。而在 Git 中,每个开发者的代码仓库都包含了所有变更历史。

除了分布式之外,Git 在设计之初也考虑了性能、安全性和灵活性。

高性能

Git 的底层性能相较于其他版本管理软件有强大的优势。提交修改、创建分支、合并分支和比较版本都针对性能进行了优化。Git 中实现的算法利用了现实中代码树的特点以及它们被修改和访问的常见模式。

不同于某些版本管理软件,Git 在决定文件树的储存和版本历史时,不会被文件名的变化所愚弄——Git 关注的是文件的内容本身。毕竟,代码文件经常会被重命名、拆分和重新编排。Git 仓库中的文件对象通过差分编码(delta encoding,仅保存代码修改的差分)和压缩技术储存,并且直接保存文件夹中的内容和版本控制元数据。

分布式架构也给 Git 带来了巨大的性能优势。

比如说,有一名开发成员 Alice 修改了代码,添加了一些准备在 2.0 版本中发布的功能,然后提交了这些修改及其描述。随后,她又编写并提交了另一个新功能。很自然地,这两次修改是版本历史中两份独立的工作。Alice 又切换到了 1.3 版本的分支,修复了一个只影响这个旧版本的 bug。这次修复的目的是为了让团队在 2.0 版本还没有完成之前,发布一个 1.3.1 版本来解决旧版本中的一些 bug。Alice 可以立刻回到 2.0 版本分支,继续新功能开发。这一切都不需要网络连接,非常快速可靠,甚至可以在飞机中完成。当她准备好将这些单独提交的更改发送到远程仓库时,她只需要一个“推送”(push)命令。

安全

Git 设计时就把托管代码的完好性作为重中之重。文件内容以及文件、目录、版本、标签和提交的关联,都通过安全的加密哈希校验算法(SHA1)保护。这可以避免代码和修改历史被不小心或者恶意改变,并且保证修改历史完全可追迹。

你可以相信在 Git 中源代码的修改历史是真实可靠的。

有一些版本管理软件无法防止版本历史之后被篡改。这对于任何依赖软件开发的团队来说都是严重的安全漏洞。

灵活

Git 的关键设计目标之一就是灵活。Git 在很多方面都展现出了其灵活性:支持多种非线性的工作流,对不同规模的项目来说都很高效,并且兼容多个操作系统和协议。

Git 在设计时最重要的功能便是分支和标签(不同于 SVN),因此所有影响分支和标签的操作也都会被保存到修改历史中。不是所有的版本管理软件关注的都是这个层面的版本追踪。

使用 Git 进行版本管理

Git 对于绝大多数软件开发团队来说都是最好的选择。虽然每个团队都需要考虑自身的情况,但我们依然可以列举一些 Git 比其他版本控制系统更好的理由:

Git 很好用

Git 兼具大多数团队和个人开发者需要的功能、性能,安全性和灵活性。我们已经具体讨论过了这些特点。对很多团队来说,它们发现 Git 在这几点上都表现的更优秀。

Git 已经成为了事实上的行业标准

Git 使用最广泛的版本管理软件。这使得 Git 在以下这些方面具有极大的吸引力。在 Atlassian(作者所在的公司),大多数代码都是通过 Git 管理的。

大量开发者都有过 Git 的使用经历,很大一部分大学毕业生甚至只用过 Git 进行版本管理。虽然迁移到 Git 的过程中或许会经历比较陡峭的学习曲线,但是大多数员工以及未来的员工都已经具备了使用 Git 的基本技能,这意味着他们不需要额外的培训。

除了拥有大量使用者之外,Git 的普及还意味着很多第三方的服务和 IDE 都已经集成了 Git。比如我们的 DVCS 桌面客户端 Source Tree、项目开发管理软件 JIRA 和代码托管服务 Bitbucket

如果你是一个想要积累软件开发工具使用技能的新人,Git 毫无疑问是你在版本管理方面的第一选择。

Git 是一个高质量的开源项目

Git 本身是一个经历多年良好支持和管理的开源软件项目。Git 的维护者很好地平衡了长远的用户需求,和改进可用性和功能性的例行更新。这个开源项目的质量久经考验,无数企业都极度依赖于此。

Git 还拥有良好的社区支持和庞大的用户群体。你可以找到各种深入浅出的学习资料,包括书籍,教程,以及专题网站。你也可以找到相关的播客节目和视频教程。

开源降低了业余开发者的成本,因为他们不需要花一分钱来使用 Git。对于开源项目来说,Git 无疑是 SVN 和 CVS 等上一代流行版本管理软件的接班人。

对 Git 的批评

对于 Git 的一个常见批评是它学起来不那么容易。Git 中的某些术语对于新手或者是使用其他系统的朋友可能会比较陌生。比如说,revert 这个命令在 Git、SVN、CVS 中具有不同的含义。不过,Git 向用户提供了非常强大的功能。学习掌握这些功能也许会花一些时间,但是一旦你学会了这些技能,它们会帮助你大大提高团队的开发效率。

对于曾经使用非分布式版本管理的团队来说,他们可能不想放弃中央服务器。不过,虽然 Git 被设计成分布式的架构,你依然可以建立一个“官方”的代码库来存放所有的修改。使用 Git 时,由于所有的开发者都拥有完整的代码库拷贝,所以他们的工作不会被中央服务器的状态和性能所影响。即使遇到故障,他们依然可以查看完整的项目历史。得益于 Git 的灵活性和分布式特点,你可以在保持原有工作方式的同时还可以得到 Git 带来的额外好处,而你以前甚至不会意识到这些好处。

现在你已经明白了什么是版本管理,什么是 Git 以及为什么要使用 Git ,你可以选择继续阅读下一节,了解 Git 在整个组织层面带来的好处。

这篇文章是「Git Recipes」的一部分,点击 目录 查看所有章节。

如果你觉得文章对你有帮助,欢迎点击右上角的 Star :star2: 或 Fork :fork_and_knife:。

如果你发现了错误,或是想要加入协作,请参阅 协作说明