当多个人共同参与一个软件项目时,就需要一个系统以可追溯的方式存储 所有的更改。这样的版本控制系统还必须让所有开发人员都能访问整个项目, 以使每位程序员都能了解其他人员最近的工作内容、尝试他人的代码,并测试 这些代码与自己所做更改之间的交互情况。
在过去,曾有过许多版本控制系统,如 Concurrent Versions System(CVS)、 Apache Subversion(SVN)或 Microsoft Visual SourceSafe(VSS),但是,在过去 的十年里,Git 已成为事实上的标准版本控制系统。
GitHub 网络平台在这一成功中发挥了重要作用,它极大地简化了 Git 的 学习和使 用。当 然,GitHub 并非唯一的 Git 平台,主要的竞争对手还包括 GitLab、Azure DevOps Services 和 Bitbucket。
人人都在用,却没人懂它
尽管 Git 备受推崇,但它显然是由专业人士为专业人士设计的,你需要牢 记以下几点:
- 达到一个目标有多种方法。对于已经熟悉 Git 的读者来说,这个观点很 有用,但如果你刚开始学习 Git,这种多样性可能会让你感到困惑。
- Git 开源项目的文档丰富。在手册页和网站上,每一个 git 命令和每一种 可能的应用都以极其细致的方式进行了说明,并且考虑了很多可能的特殊情 况,这些可以帮助你快速地上手。
- Git 一些术语有多种含义,而且容易混淆的子命令可能会执行截然不同 的任务。一些术语的含义会根据上下文的不同而有所不同,或者在文档中的使 用不一致。
我们得坦白,尽管我们已经使用 Git 多年,但在写这本书的过程中还是学 到了很多!
关于本书
我们可以以极简的方式使用 Git,但是,日常操作中的微小偏差也可能导 致令人惊讶且通常难以理解的副作用或错误。
每个 Git 初学者都经历过那种感受:当一个 git 命令返回一条难以理解的 错误信息时,你会吓出一身冷汗,怀疑自己是否刚刚永久性地破坏了所有开 发人员的存储库,并试图找到合适的人来用正确的命令说服 Git 继续工作。因 此,不深入学习 Git 是没有用的,只有充分了解 Git 的工作原理,你才能有信 心干净利落地解决合并冲突或其他问题。
同时,我们也知道,如果我们不优先考虑基本功能,这本书就无法发挥作 用。这本书内容很多,但它并不是 Git 的全包式指南,我们不可能考虑每一种 特殊情况或介绍每一个 Git 子命令。我们写这本书就是为了把真实有用的东西 挑出来,去掉那些不实的部分。本书分为以下 12 章。
在第 1 章进行简短介绍之后,我们将在第 2 章至第 4 章中介绍 Git 的使 用,将重点介绍在命令级别使用 Git,并简要讨论 GitHub 或其他用户界面 (UI)等平台。对于 Git 初学者,我们建议先阅读前 4 个章节。即使你有一些 Git 经验,也一定要花几个小时阅读第 3 章,并在测试存储库中尝试我们介绍 的一些技术(合并、变基等)。
接下来的 3 个章节介绍了最重要的 Git 平台。特别是对于复杂的项目,这 些平台提供了有用的附加功能,例如执行自动测试或实现持续集成(CI)。当 然,我们也会向你展示如何托管自己的 Git 存储库。使用 GitLab、Gitea 或 Gitolite,可以相对容易地实现这一目标。
然后,我们将从基础转向实践。在第 8 章中,我们将描述使用 Git 引导众 多开发人员走上有序路径(分支)的流行模式。第 9 章重点关注 Git 的高级功 能,如钩子、子模块、子树和双重身份验证。第 10 章将展示如何在 Linux 系 统上使用 Git 管理版本配置文件(dotfiles)或整个 /etc 目录,如何将项目从 SVN 迁移到 Git,以及如何使用 Git 和 Hugo 快速轻松地实现一个简单的网站。
第 11 章将帮助你解决难以理解的错误信息所带来的僵局。在这一章中,你还 会找到实现特殊请求的说明,例如从 Git 存储库中删除大文件或仅对选定文件 执行合并操作。
在本书的结尾,第 12 章简要总结了最重要的 git 命令及其选项。 或许你只想知道足够多的内容,以便能够准确地使用 Git,进而推动项目的进展。我们理解这种动机,但是,我们仍然强烈建议您比原计划多花几个小 时来系统地了解 Git。
我们向你保证,你阅读本书之后一定会感觉物有所值。虽然,你当前的关 注点主要在于项目,但 Git 技能是作为一名开发者在未来许多项目中都需要掌 握的长期核心竞争力。
祝你在使用 Git 的过程中取得圆满成功!