Git 是什么?


你几乎肯定手动进行过版本控制。一个包含 report.docx、report_final.docx、report_final_v2.docx 和 report_final_ACTUAL.docx 的文件夹就是版本控制,只不过是最糟糕的那种。你无法看出这两个文件之间发生了什么变化,无法合并两个人同时进行的编辑,也肯定无法恢复三个版本前删除的好段落。
Git 能够正确地解决这个问题。它是一个工具,可以记录项目随时间推移的快照,这样你的整个历史就存储在一个地方,而不是一堆副本。这个工具本身是一个小程序,存放在你自己的计算机上:你在终端中输入以 git 开头的命令,它会以文本形式回复。
Git 能为你做什么
Git 的核心功能是维护项目的时间线。每当你到达值得保存的地点时,你就记录一个 提交:每个文件的快照,加上一条简短的消息说明发生了什么变化以及为什么。稍后你可以回顾这条时间线,精确地看到项目是如何到达现状的。以下是一条真实的时间线,由 git log 打印,这是列出项目提交的命令(--oneline 标志将每个提交缩短为一行):
$ git log --oneline
a1b2c3d 添加密码强度计量器
9f8e7d6 修复注册表单验证
5c4b3a2 设置项目结构这是项目历史中三个保存的点,最新的在最上面,每个都有一个短 ID 和其作者编写的消息。(在每个这样的例子中,以 $ 开头的行是在终端中输入的命令,不包括 $ 本身,下面的行是 Git 的回复。)你将在接下来的几章中学到每个生成和读取这个历史的命令。现在要记住的想法是 Git 正在将你的工作记录为 一系列你总是可以返回的快照。
一旦你的项目拥有这样的历史,许多事情就成为可能了。你可以看到发生了什么变化以及谁改变了它。你可以在一旁尝试一个冒险的想法,如果不行就干净地丢弃它。你可以将整个项目及其完整历史交给其他人。当两个人编辑相同的代码时,Git 可以合并他们的工作,并标记他们不一致的地方,以便人类可以解决。这四项能力,即历史、安全实验、共享和合并工作,是 Git 在几乎所有专业代码库下运行的全部原因。
final_v2_ACTUAL 副本是 Git 被创建来结束的问题,我保证第一次删除其中一个时感觉很棒。 Git 和 GitHub 是不同的东西
这一点在开始时会迷惑几乎每个人,所以这里用简明的术语说一下。Git 是版本控制工具。它在你自己的计算机上运行,它记录你的提交,它不需要互联网连接也不需要账户就能工作。GitHub 是一个在线存储 Git 仓库的网站,并在其周围添加了一些功能:一个共享代码的地方、相互审查变化、报告问题和协作。
感受区别的最清晰方式:你可以每天使用 Git,在笔记本上提交和分支,而无需创建 GitHub 账户。GitHub 只有在你想将仓库放在共享位置以便其他人或其他机器可以访问时才会出现。Git 是引擎;GitHub 是一个托管它所生成内容的地方。 还有其他地方,例如 GitLab 和 Bitbucket,它们都在下面托管相同的 Git 仓库。
Git 的来源
Git 的历史解释了很多关于它为什么以这样的方式工作的原因。它在 2005 年由 Linus Torvalds 编写,他就是启动 Linux 的人。Linux 内核是由散布在世界各地的数千个志愿者构建的,几年来他们一直使用一个称为 BitKeeper 的商业工具来协调所有这些工作,该工具背后的公司允许开源项目免费使用。
在 2005 年,这种免费安排破裂了,内核社区突然没有了工具来管理其庞大、快速发展的代码库。当时没有其他可用的工具能够跟上。所以 Torvalds 从内核工作中抽身出来,花了几周时间编写自己的版本控制工具,目标明确,形成于解决这个确切问题。
他希望它是 分布式的,这样每个贡献者都可以在自己的机器上拥有完整的项目历史,并可以在不与中央服务器通信的情况下工作。他希望它 快速,足够快地处理内核大小的项目,而不会让人们等待。他希望它能保证 完整性,这样没有人可以悄悄改变历史,也没有磁盘错误可以破坏项目而不被注意到。
这些目标是 Git 今天的行为方式的原因。当你 clone 一个项目时,你获得了它的全部历史来使用,这是分布式目标的实际应用:你可以在没有 wifi 的飞机上进行提交、分支和浏览历史。每个提交都用从其精确内容计算的指纹标记,所以如果单个字节曾经改变,指纹就不再匹配,Git 会注意到。Torvalds 在 2005 年匆匆做出的设计决定是你现在每次使用 Git 时都依赖的决定。
clone 给你完整的历史来离线使用,以及为什么每个提交都获得一个指纹。这是对你将使用多年的工具的有用背景。 本手册接下来去哪里
心理模型到位后,轨道的其余部分是关于进行工作。你的第一个仓库 从零开始:打开终端,如果你的机器没有 Git 就安装它,并将一个文件夹变成你可以提交的仓库。从那里你将学到保存变化的日常循环,然后分支、合并和 GitHub 上的协作流程。如果一个术语曾经让你困惑,词汇表 中有这些文档中每个 Git 术语的简短定义。

