了解 Git 历史

Git 会以与集中式版本控制系统 (CVCS)(如 Team Foundation Version Control、Perforce 或 Subversion)完全不同的方式表示历史记录。 集中式系统会在存储库中存储每个文件的单独历史记录。 Git 则会将历史记录存储为整个存储库的快照图。 这些快照(在 Git 中称为提交)可有多个父项,从而可创建类似图形而非直线的历史记录。 这种历史记录差异非常重要,同时也是熟悉 CVCS 的用户发现 Git 令人困惑的主要原因所在。

提交历史记录基础知识

从一个简易历史记录示例开始:具有三个线性提交的存储库。

Three commits in a line

提交 A 是提交 B 的父级,提交 B 是提交 C 的父级。此历史记录看起来与 CVCS 非常相似。 指向提交 C 的箭头是一个分支。 分支是指向特定提交的指针,这就是分支在 Git 中如此轻量级和简单的原因。

与 CVCS 相比,Git 的一个关键区别在于开发人员拥有自己的存储库完整副本。 他们需通过从远程仓库获取最新提交来保持其本地仓库与远程仓库的同步。 为此,他们使用以下命令拉取主分支:

git pull origin main

此操作会合并远程存储库中主分支的所有更改,默认情况下 Git 将其命名为 origin。 此拉取会产生一个新提交,而本地存储库中的主分支则会移动到该提交。

A fourth commit, D, is added to the line

了解分支历史记录

现在,是时候更改代码了。 并行处理不同功能时,通常有多个活动分支。 这与 CVCS 形成鲜明对比,CVCS 新分支繁多且很少创建。 第一步是使用以下命令签出到新分支:

git checkout -b cool-new-feature

以下是对两个命令进行组合的快捷方式:

  • git branch cool-new-feature 以创建分支
  • git checkout cool-new-feature 以开始在分支中操作

Branch cool-new-feature is added

两个分支现在指向同一个提交。 假设在 E 和 F 这两个新提交中,cool-new-feature 分支出现一些更改。

Add commits to a branch

这些提交由 cool-new-feature 分支访问,因为它们已提交到该分支。 完成该功能后,需将其合并到主分支中。 为此,请使用以下命令:

git merge cool-new-feature main

Merge a branch

合并时,历史记录的图形结构变为可见。 当分支合并到另一分支时,Git 会创建一个新提交。 这是合并提交。 由于没有冲突,因此该合并提交不含任何更改。 如果存在冲突,合并提交将包括解决这些问题所需的更改。

现实世界中的历史记录

下面是 Git 历史记录的示例,它更类似于团队中正在开发的代码。 有三个人几乎同时将自己分支中的提交合并到 main 分支。

Console log of git graph

后续步骤

详细了解如何在 GitHubAzure ReposGit 日志历史记录简化中使用 Git 历史记录。