Git 的提交(Commit)是版本控制的核心概念,每次提交都会形成一个独立的快照,记录了文件的状态变化。本章将详细介绍 Git 提交的概念,包括如何识别提交、查看提交历史、以及如何查找特定的提交记录。
7.1 原子变更集
Git 采用原子提交(Atomic Commit)的方式管理更改,这意味着每次提交都是完整的,所有更改要么全部生效,要么全部取消,而不会出现部分变更被提交的情况。
7.1.1 提交的基本操作
使用 git commit
创建新提交:
git commit -m "提交说明"
如果尚未将更改添加到暂存区(Staging Area),可以使用 -a
选项:
git commit -a -m "提交所有修改的文件"
查看提交历史:
git log
7.2 识别提交
Git 使用唯一的提交哈希值(SHA-1)来标识每个提交。每次提交都会生成一个 40 位的 SHA-1 哈希,例如:
commit 1a2b3c4d5e6f7g8h9i0j
7.2.1 绝对提交名
绝对提交名是提交的完整 SHA-1 哈希,如:
1a2b3c4d5e6f7g8h9i0j1234567890abcdef
使用 git rev-parse
获取完整哈希值:
git rev-parse HEAD
7.2.2 引用和符号引用
Git 允许使用符号引用(Symbolic Reference)来简化提交标识,例如:
HEAD
:当前所在分支的最新提交HEAD~1
:上一个提交HEAD^
:上一个提交(等同于HEAD~1
)HEAD~2
:前两个提交
示例:
git show HEAD~1
7.2.3 相对提交名
相对提交名可以使用 HEAD
结合 ^
或 ~
进行引用,例如:
git show HEAD~2
7.3 提交历史记录
Git 提供多种方式查看提交历史,以帮助开发者追踪代码变更。
7.3.1 查看旧提交
使用 git log
查看历史提交:
git log --oneline --graph --decorate --all
输出示例:
* 1a2b3c4 (HEAD -> main) 修复 Bug
* 9d8e7f6 增加新功能
* 3c2b1a0 初始提交
7.3.2 提交图
使用 git log --graph
以可视化方式查看提交历史:
git log --graph --all --oneline
7.3.3 提交范围
可以查看特定范围的提交,例如:
git log HEAD~5..HEAD
或者查看特定时间段的提交:
git log --since="2 weeks ago"
7.4 查找提交
Git 提供多种工具用于查找特定的提交,例如 git bisect
、git blame
和 Pickaxe。
7.4.1 使用 git bisect
git bisect
采用二分查找法来定位引入 Bug 的提交。
使用步骤:
启动 bisect 模式:
git bisect start
标记当前版本为坏(Bad):
git bisect bad
标记一个已知良好的版本(Good):
git bisect good <commit-hash>
Git 会自动切换到中间的提交,测试代码后继续标记 bad
或 good
,直到找到 Bug 引入的提交。
结束 bisect 查找:
git bisect reset
7.4.2 使用 git blame
git blame
用于查看文件的每一行是由哪个提交修改的,以及修改的作者和时间。例如:
git blame file.txt
示例输出:
1a2b3c4d (Alice 2024-01-01) 修复拼写错误
9d8e7f6g (Bob 2023-12-25) 初始版本
7.4.3 使用 Pickaxe
Pickaxe 是 Git 的一种搜索功能,允许查找某个特定字符串的修改历史。例如,要查找某个变量 myVariable
的修改记录:
git log -S "myVariable" --oneline
结论
本章介绍了 Git 提交的基本概念,包括如何标识提交、查看提交历史,以及查找特定的提交记录。掌握这些技巧可以帮助开发者更高效地管理代码历史,并快速定位问题。