介绍
欢迎,Git 时空旅行者!今天,我们将踏上一段探索 Git 项目历史的精彩旅程。Git 最强大的特性之一就是它能够追踪并展示项目的完整演进历史。这段历史不仅是过去发生之事的记录,更是理解、调试和改进项目的强大工具。
在本实验中,我们将深入探索 git log 命令,它是你查看 Git 历史记录的窗口。我们将从基础用法开始,然后深入研究高级技巧,例如格式化日志输出、按日期过滤日志、搜索特定更改,甚至从项目历史中生成统计数据。
完成本实验后,你将能够像专家一样自如地查阅项目历史,提取有价值的见解和信息,从而成为一名更高效的开发者。无论你是要追踪漏洞、审查代码更改,还是仅仅想了解项目的演化过程,这里学到的技能都将让你受益匪浅。
让我们踏入 Git 时光机,开始探索过去吧!
设置工作区
在深入研究 Git 的历史功能之前,我们先建立一个带有提交历史的工作区以便探索。我们将创建一个新目录,初始化一个 Git 仓库,并添加一些提交记录。
打开终端并输入以下命令:
cd ~/project
mkdir git-history-lab
cd git-history-lab
git init
现在,让我们创建一些文件并进行一系列提交,请复制并粘贴以下命令:
echo "## Git History Lab" > README.md
git add README.md
git commit -m "Initial commit"
echo "function hello() {" > script.js
echo " console.log('Hello, Git!');" >> script.js
echo "}" >> script.js
git add script.js
git commit -m "Add hello function"
echo "function goodbye() {" >> script.js
echo " console.log('Goodbye, Git!');" >> script.js
echo "}" >> script.js
git add script.js
git commit -m "Add goodbye function"
echo "This is a test file" > test.txt
git add test.txt
git commit -m "Add test file"
echo "hello();" >> script.js
echo "goodbye();" >> script.js
git add script.js
git commit -m "Call hello and goodbye functions"
让我们回顾一下刚才的操作:
- 我们创建了一个 README 文件并进行了首次提交。
- 我们创建了一个包含「hello」函数的 JavaScript 文件并提交。
- 在同一个文件中添加了「goodbye」函数并提交。
- 添加了一个测试文件并提交。
- 最后,我们修改了脚本以调用这两个函数并提交了更改。
现在我们有了一个拥有丰富历史记录的仓库可以用来探索了!
基础日志用法
既然已经有了提交历史,让我们来探索 git log 的基础用法。
要查看项目的提交历史,只需运行:
git log
你应该会看到类似这样的输出:
commit 1234567890abcdef1234567890abcdef12345678 (HEAD -> main)
Author: Your Name <your.email@example.com>
Date: Mon Jun 5 10:00:00 2023 +0000
Call hello and goodbye functions
commit 2345678901abcdef2345678901abcdef23456789
Author: Your Name <your.email@example.com>
Date: Mon Jun 5 09:45:00 2023 +0000
Add test file
...
日志中的每个条目都显示了:
- 完整的提交哈希值(commit hash,提交的唯一标识符)
- 提交者(作者)
- 提交的日期和时间
- 提交说明(commit message)
默认情况下,git log 会按时间倒序(最新的在前)列出所有提交。
如果输出内容很长,Git 会在分页器(通常是 less)中显示。你可以使用方向键导航,按 q 键退出。
要查看更简洁的日志版本,可以使用:
git log --oneline
这会将每个提交压缩到一行显示,仅包含短哈希值和提交说明。
请记住,git log 是你了解项目历史的窗口。它是理解项目在何时、由谁进行了哪些更改的绝佳起点。
格式化日志输出
Git 提供了强大的选项来格式化日志输出,以便精确显示你所需的信息。让我们探索其中一些选项。
要查看每个提交中修改了哪些文件,请使用 --stat 选项:
git log --stat
这将显示每个提交中更改了哪些文件,以及添加或删除了多少行。
若要查看更详细的更改内容,请使用 -p 选项:
git log -p
这会显示每个提交的实际补丁(patch),即具体增加和删除的代码行。这对于详细审查更改非常有用。
你还可以使用 --pretty 选项创建自定义格式。例如:
git log --pretty=format:"%h - %an, %ar : %s"
这将显示:
%h:简短提交哈希%an:作者姓名%ar:相对作者日期(如「3 days ago」)%s:主题(提交说明)
你可以自定义此格式字符串以包含任何你需要的信息。以下是一些常用的占位符:
%H:完整提交哈希%ad:作者日期%cn:提交者姓名%ce:提交者邮箱%cd:提交者日期
尝试不同的格式,找到最适合你的一种!
按日期过滤日志
通常,你可能只想查看特定时间范围内的提交。Git 提供了多种按日期过滤日志的选项。
查看过去一周的提交:
git log --since=1.week
你也可以使用具体的日期:
git log --after="2023-06-01" --before="2023-06-30"
这将显示 2023 年 6 月 1 日至 6 月 30 日之间的提交。
Git 能理解多种日期格式,包括相对日期,如「yesterday」(昨天)、「1 month 2 weeks 3 days ago」(1 个月 2 周 3 天前)等。
你也可以使用 --until 代替 --before,而 --after 与 --since 是同义词。
请记住,这些过滤器显示的是提交日期在指定范围内的提交。提交日期是创建提交的时间,可能与实际修改代码的时间有所不同。
如果你正在调查某个特定更改是什么时候引入的,你可能需要使用 --grep 选项来搜索特定的提交说明,我们将在下一步中介绍。
搜索特定更改的日志
Git 提供了强大的搜索功能,帮助你找到特定的提交。让我们探索其中的一些特性。
搜索提交说明中包含特定关键词的提交:
git log --grep="function"
这将显示所有提交说明中出现「function」一词的提交。
你也可以搜索针对特定文件的更改:
git log -- script.js
这会显示所有影响了 script.js 文件的提交。
要搜索添加或删除了特定代码行的更改:
git log -S "console.log"
这被称为「pickaxe」搜索。它会显示「console.log」出现次数发生变化的提交。
你可以将这些选项组合使用。例如,查看过去一周内对 script.js 的详细更改:
git log -p --since=1.week -- script.js
请注意,Git 的搜索默认是区分大小写的。使用 -i 选项可以进行不区分大小写的搜索:
git log --grep="function" -i
当你试图追踪某个特定更改的引入时间或某个漏洞的修复时间时,这些搜索功能将非常有用。
从日志生成统计数据
Git 可以通过统计数据为你提供关于项目历史的有价值见解。让我们探索几种生成这些统计数据的方法。
查看按作者分类的提交数量摘要:
git shortlog -s -n
这将显示作者列表,按提交数量排序,每个名字旁边都有提交计数。
查看每位作者添加和删除了多少行代码:
git log --author="Jane Doe" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "Added lines: %s, Removed lines: %s, Total lines: %s\n", add, subs, loc }'
请将「Jane Doe」替换为你想要查询的作者姓名。
查看哪些文件更改最频繁:
git log --pretty=format: --name-only | sort | uniq -c | sort -rg | head -10
这将显示修改频率最高的前 10 个文件。
查看总提交次数:
git rev-list --count HEAD
这些统计数据对于理解项目的整体开发模式非常有用。它们可以帮助识别项目中开发最活跃的部分、最活跃的贡献者,以及项目随时间的增长情况。
请记住,虽然这些统计数据能提供参考,但它们并不能代表全部。提交次数或更改的行数并不一定与贡献的影响力或质量成正比。
总结
恭喜你,Git 历史学家!你刚刚解锁了 Git 历史记录和日志管理功能的强大力量。让我们回顾一下我们涵盖的关键概念:
- 基础日志用法:学习了如何使用
git log查看项目的提交历史。 - 格式化日志输出:发现了如何自定义日志输出以精确显示所需信息。
- 按日期过滤日志:掌握了如何聚焦于特定时间范围内的提交。
- 搜索特定更改的日志:学习了寻找特定更改引入时机的强大技巧。
- 从日志生成统计数据:探索了提取项目开发模式见解的方法。
随着你参与更大规模的项目,这些技能将变得不可或缺。无论你是要追踪漏洞、审查功能的演进,还是试图理解项目的整体开发趋势,git log 命令及其各种选项都将是你忠实的伙伴。
请记住,Git 的历史记录不仅仅是过去发生之事的记录——它是理解和改进项目的强大工具。明智地使用它,它将使你成为一名更高效的开发者。
继续探索并尝试这些命令吧。你对项目历史的导航越熟练,就能从中获取越多的洞察。祝你在 Git 仓库的时空旅行中玩得愉快!



