Git 的提交(Commit)是版本控制的核心概念,每次提交都会形成一个独立的快照,记录了文件的状态变化。本章将详细介绍 Git 提交的概念,包括如何识别提交、查看提交历史、以及如何查找特定的提交记录。


7.1 原子变更集

Git 采用原子提交(Atomic Commit)的方式管理更改,这意味着每次提交都是完整的,所有更改要么全部生效,要么全部取消,而不会出现部分变更被提交的情况。

7.1.1 提交的基本操作

使用 git commit 创建新提交:

  1. git commit -m "提交说明"

如果尚未将更改添加到暂存区(Staging Area),可以使用 -a 选项:

  1. git commit -a -m "提交所有修改的文件"

查看提交历史:

  1. git log

7.2 识别提交

Git 使用唯一的提交哈希值(SHA-1)来标识每个提交。每次提交都会生成一个 40 位的 SHA-1 哈希,例如:

  1. commit 1a2b3c4d5e6f7g8h9i0j

7.2.1 绝对提交名

绝对提交名是提交的完整 SHA-1 哈希,如:

  1. 1a2b3c4d5e6f7g8h9i0j1234567890abcdef

使用 git rev-parse 获取完整哈希值:

  1. git rev-parse HEAD

7.2.2 引用和符号引用

Git 允许使用符号引用(Symbolic Reference)来简化提交标识,例如:

  • HEAD:当前所在分支的最新提交
  • HEAD~1:上一个提交
  • HEAD^:上一个提交(等同于 HEAD~1
  • HEAD~2:前两个提交

示例:

  1. git show HEAD~1

7.2.3 相对提交名

相对提交名可以使用 HEAD 结合 ^~ 进行引用,例如:

  1. git show HEAD~2

7.3 提交历史记录

Git 提供多种方式查看提交历史,以帮助开发者追踪代码变更。

7.3.1 查看旧提交

使用 git log 查看历史提交:

  1. git log --oneline --graph --decorate --all

输出示例:

  1. * 1a2b3c4 (HEAD -> main) 修复 Bug
  2. * 9d8e7f6 增加新功能
  3. * 3c2b1a0 初始提交

7.3.2 提交图

使用 git log --graph 以可视化方式查看提交历史:

  1. git log --graph --all --oneline

7.3.3 提交范围

可以查看特定范围的提交,例如:

  1. git log HEAD~5..HEAD

或者查看特定时间段的提交:

  1. git log --since="2 weeks ago"

7.4 查找提交

Git 提供多种工具用于查找特定的提交,例如 git bisectgit blame 和 Pickaxe。

7.4.1 使用 git bisect

git bisect 采用二分查找法来定位引入 Bug 的提交。

使用步骤:

  1. 启动 bisect 模式:

    1. git bisect start
  2. 标记当前版本为坏(Bad):

    1. git bisect bad
  3. 标记一个已知良好的版本(Good):

    1. git bisect good <commit-hash>

Git 会自动切换到中间的提交,测试代码后继续标记 badgood,直到找到 Bug 引入的提交。

  1. 结束 bisect 查找:

    1. git bisect reset

7.4.2 使用 git blame

git blame 用于查看文件的每一行是由哪个提交修改的,以及修改的作者和时间。例如:

  1. git blame file.txt

示例输出:

  1. 1a2b3c4d (Alice 2024-01-01) 修复拼写错误
  2. 9d8e7f6g (Bob 2023-12-25) 初始版本

7.4.3 使用 Pickaxe

Pickaxe 是 Git 的一种搜索功能,允许查找某个特定字符串的修改历史。例如,要查找某个变量 myVariable 的修改记录:

  1. git log -S "myVariable" --oneline

结论

本章介绍了 Git 提交的基本概念,包括如何标识提交、查看提交历史,以及查找特定的提交记录。掌握这些技巧可以帮助开发者更高效地管理代码历史,并快速定位问题。