文章目录
- [1. 简介](#1. 简介)
- [2. 格式](#2. 格式)
- [3. 选项](#3. 选项)
- [4. 示例](#4. 示例)
-
- [4.1 基本用法](#4.1 基本用法)
- [4.2 显示指定行范围](#4.2 显示指定行范围)
- [4.3 显示作者邮箱](#4.3 显示作者邮箱)
- [4.4 忽略空白变更](#4.4 忽略空白变更)
- [4.5 检测跨文件移动的代码](#4.5 检测跨文件移动的代码)
- [4.6 查看某行何时被删除](#4.6 查看某行何时被删除)
- [5. 注意](#5. 注意)
-
- [5.1 常见输出格式](#5.1 常见输出格式)
- [5.2 `git blame` vs `git log`](#5.2
git blamevsgit log) - [5.3 查看重构前的代码出处](#5.3 查看重构前的代码出处)
- [5.4 常用别名设置](#5.4 常用别名设置)
- [6. 小结](#6. 小结)
- 参考文献
1. 简介
git blame 用于查看文件中每一行代码的最后修改信息,包括修改人、修改时间和对应的提交哈希。
简单来说:git blame 告诉你"这行代码是谁写的、什么时候写的"。
典型场景:
- 定位 bug 是谁引入的
- 了解某行代码的修改原因
- 代码审查时追溯历史
注意: git blame 显示的修改时间是提交者执行 git commit 时的时间,而不是实际编辑代码的时间。
2. 格式
bash
git blame [<options>] [--] <file>
3. 选项
bash
-L <start>,<end>
只显示指定行号范围(如 `-L 10,20`)
-n, --show-number
显示原始提交的行号(默认已显示)
-w
忽略空白字符的变更
-M | -C | -C -C
检测跨文件移动或复制的代码(`-C` 级别越高检测越广)
--reverse
反向 blame,查看某行何时被删除(结合新旧版本使用)
-e
显示作者邮箱而非用户名
-s
隐藏作者名(只显示提交哈希)
--since <date>
只显示指定日期之后的修改
4. 示例
4.1 基本用法
bash
# 查看 main.go 文件的每行修改信息
git blame main.go
输出示例:
a1b2c3d4 (张三 2024-01-15 10:30:00 +0800 1) package main
e5f6g7h8 (李四 2024-02-20 14:20:00 +0800 2) import "fmt"
a1b2c3d4 (张三 2024-01-15 10:30:00 +0800 3)
i9j0k1l2 (王五 2024-03-10 09:00:00 +0800 4) func main() {
e5f6g7h8 (李四 2024-02-20 14:20:00 +0800 5) fmt.Println("hello")
a1b2c3d4 (张三 2024-01-15 10:30:00 +0800 6) }
4.2 显示指定行范围
bash
# 只显示第 4 到第 6 行
git blame -L 4,6 main.go
4.3 显示作者邮箱
bash
# 显示邮箱而非用户名
git blame -e main.go
4.4 忽略空白变更
bash
# 忽略仅空白字符的修改
git blame -w main.go
4.5 检测跨文件移动的代码
bash
# 检测从其他文件复制或移动过来的代码
git blame -C main.go
4.6 查看某行何时被删除
bash
# 使用 reverse 查看文件某行何时被删除
git blame --reverse 旧版本..新版本 -- main.go
5. 注意
5.1 常见输出格式
| 字段 | 说明 | 示例 |
|---|---|---|
| 提交哈希 | 最后修改该行的提交 ID | a1b2c3d4 |
| 作者 | 最后修改人 | 张三 |
| 时间 | 最后修改时间 | 2024-01-15 10:30:00 +0800 |
| 行号 | 原文件中的行号 | 1) |
| 代码 | 该行内容 | package main |
5.2 git blame vs git log
| 命令 | 粒度 | 用途 |
|---|---|---|
git blame |
行级别 | 查看某一行是谁改的 |
git log |
文件级别 | 查看文件的提交历史 |
5.3 查看重构前的代码出处
bash
# 检测从其他文件移动来的代码(更彻底)
git blame -C -C main.go
5.4 常用别名设置
bash
git config --global alias.bl "blame -w"
git config --global alias.blamee "blame -e"
# 使用别名
git bl main.go
git blamee main.go
6. 小结
| 需求 | 命令 | 说明 |
|---|---|---|
| 查看文件每行修改信息 | git blame <file> |
最常用,显示作者、时间、提交 |
| 显示指定行范围 | git blame -L 10,20 <file> |
只查看感兴趣的行 |
| 忽略空白变更 | git blame -w <file> |
避免被格式化干扰 |
| 显示作者邮箱 | git blame -e <file> |
方便邮件联系 |
| 检测跨文件移动 | git blame -C <file> |
追溯重构后代码的来源 |
一句话总结 :git blame 是代码追溯的"侦探工具",帮你快速定位每一行代码的"最后修改人"和"修改原因"。