还在用 git blame?这个工具3秒告诉你代码归属,新项目必备!

📌 **一句话总结**:`git-who` 是 `git blame` 的增强版,能让你快速搞清"这整块代码到底是谁写的?"

---

在日常开发中,我们经常会遇到这样的场景:

- 看到一段奇怪的逻辑,想问问谁写的?

- 新接手一个项目,想知道有哪些人参与过开发?

- Code Review 时想快速定位某段代码的历史作者?

这时候,很多人会想到 `git blame`。没错,它确实能告诉你每一行是谁最后修改的。但有没有更简洁、更直观的方式?

**答案就是——`git-who`!**

今天,我们就来聊聊这个"非官方但超实用"的 Git 小工具。

---

## 一、git-who 是什么?

首先明确一点:`git-who` 不是 Git 官方自带的命令,但它是一个**真实存在的开源工具**。

项目地址:https://github.com/sinclairtarget/git-who

**核心特点**:

- `git blame` 告诉你**每一行**是谁写的

- `git-who` 告诉你**整个文件树**是谁写的

简单来说,`git-who` 就像是 `git blame` 的"文件树版本"。

### 举个🌰

假设你想知道 Python 解析器(Parser)目录下,哪些文件是谁写的:

```bash

$ git who tree Parser/

Parser/.........................Guido van Rossum (182)

├── lexer/......................Pablo Galindo Salgado (5)

│ ├── buffer.c................Lysandros Nikolaou (1)

│ ├── lexer.h.................Lysandros Nikolaou (1)

│ └── state.h

├── tokenizer/..................Filipe Laíns (1)

│ ├── helpers.c...............Lysandros Nikolaou (1)

│ └── tokenizer.h.............Lysandros Nikolaou (1)

├── Python.asdl.................Benjamin Peterson (14)

├── parser.c....................Pablo Galindo Salgado (34)

└── pegen.c.....................Pablo Galindo (33)

```

**一眼就能看出**:整个 Parser 目录主要是 Guido van Rossum 写的,但 lexer 子目录主要是 Pablo Galindo Salgado 负责的。

是不是比一行一行看 `git blame` 清晰多了?

---

## 二、git-who 的三大核心功能

`git-who` 提供了三个子命令,每个都解决不同的问题:

### 1️⃣ `table` - 贡献者统计表(默认)

查看整个仓库或某个目录的贡献者排名:

```bash

$ git who

┌─────────────────────────────────────────────────────┐

│Author Last Edit Commits│

├─────────────────────────────────────────────────────┤

│Guido van Rossum 2 mon. ago 11,213│

│Victor Stinner 1 week ago 7,193│

│Fred Drake 13 yr. ago 5,465│

│Georg Brandl 1 year ago 5,294│

│Benjamin Peterson 4 mon. ago 4,724│

│...3,026 more... │

└─────────────────────────────────────────────────────┘

```

**常用场景**:

- 新加入项目,想快速了解团队贡献者

- 想知道某个目录下谁贡献最多

**高级用法**:

```bash

# 只看某个目录

$ git who Tools/

# 只看某个版本

$ git who v3.7.1

# 只看某个版本范围

$ git who v3.10.9..v3.11.9

# 按代码行数排序

$ git who -l

# 按文件数排序

$ git who -f

```

### 2️⃣ `tree` - 文件树视图

以树形结构展示每个文件/目录的主要贡献者:

```bash

$ git who tree src/

src/.........................Alice Developer (156)

├── utils/....................Bob Coder (42)

│ ├── helper.js............Bob Coder (15)

│ └── validator.js.........Alice Developer (8)

├── components/...............Charlie Tester (89)

│ ├── Button.js............Charlie Tester (23)

│ └── Modal.js.............Alice Developer (12)

└── main.js..................Alice Developer (45)

```

**常用场景**:

- 快速了解项目结构对应的负责人

- 找到某个模块的主要维护者

**高级用法**:

```bash

# 显示所有文件(包括未标注的)

$ git who tree -a

# 限制显示深度

$ git who tree -d 2

# 按代码行数标注

$ git who tree -l

```

### 3️⃣ `hist` - 历史时间线

查看贡献历史的时间线,了解项目的发展历程:

```bash

$ git who hist

1990 ┤ # Guido van Rossum (105)

1991 ┤ ## Guido van Rossum (445)

1992 ┤ ### Guido van Rossum (606)

...

2020 ┤ ###--------- Victor Stinner (524)

2021 ┤ ##---------- Victor Stinner (260)

2022 ┤ ##------------- Victor Stinner (366)

2023 ┤ ###--------------- Victor Stinner (556)

2024 ┤ ##----------------- Serhiy Storchaka (321)

```

**常用场景**:

- 了解项目的演进历史

- 查看某个时间段的主要贡献者

**高级用法**:

```bash

# 只看某个目录的历史

$ git who hist src/

# 只看某个版本之后的历史

$ git who hist v3.12.0..

# 按代码行数显示

$ git who hist -l

```

---

## 三、为什么推荐你用 git-who?

| 优势 | 说明 |

|------|------|

| ✅ **更宏观的视角** | 不只是看单行代码,而是看整个模块/目录的贡献 |

| ✅ **可视化清晰** | 树形结构一目了然,比 `git blame` 更直观 |

| ✅ **多种统计维度** | 支持按提交数、代码行数、文件数等排序 |

| ✅ **时间线分析** | `hist` 命令帮你了解项目演进历史 |

| ✅ **性能优化** | 内置缓存机制,大项目也能快速响应 |

**适用场景**:

- 🎯 新接手项目,快速了解代码结构

- 🎯 Code Review 时定位模块负责人

- 🎯 项目重构前,了解各模块的贡献者

- 🎯 团队管理,了解成员贡献分布

---

## 四、安装 git-who(3 种方式)

### 方式 1:Mac 用户(最简单)

```bash

$ brew install git-who

```

### 方式 2:下载预编译二进制

访问 [GitHub Releases](https://github.com/sinclairtarget/git-who/releases),下载对应系统的二进制文件。

**Linux/macOS**:

```bash

# 下载并解压

$ wget https://github.com/sinclairtarget/git-who/releases/download/v1.2/git-who-v1.2-linux-amd64.tar.gz

$ tar -xzf git-who-v1.2-linux-amd64.tar.gz

# 移动到 PATH

$ sudo mv git-who /usr/local/bin/

```

**Windows**:

下载 `.exe` 文件,放到 PATH 环境变量中的目录即可。

### 方式 3:Go 用户(源码安装)

```bash

$ go install github.com/sinclairtarget/git-who@latest

```

### 方式 4:Docker(无需安装)

```bash

# 直接运行

$ docker run --rm -it -v "$(pwd)":/git git-who who

# 或者设置 Git 别名

$ git config --global alias.who '!docker run --rm -it -v$(pwd):/git git-who who'

```

---

## 五、快速上手:5 分钟实战

### 步骤 1:安装(选择上面任一方式)

```bash

$ brew install git-who # Mac 用户推荐

```

### 步骤 2:验证安装

```bash

$ git who --version

git-who version 1.2

```

### 步骤 3:查看项目贡献者

```bash

# 进入任意 Git 仓库

$ cd your-project

# 查看所有贡献者

$ git who

# 查看某个目录的贡献者

$ git who src/

# 查看文件树

$ git who tree src/

```

### 步骤 4:探索高级功能

```bash

# 按代码行数排序

$ git who -l

# 查看历史时间线

$ git who hist

# 只看最近 3 个月的贡献

$ git who --since "3 months ago"

```

---

## 六、实用技巧 & 进阶用法

### 技巧 1:过滤特定作者

```bash

# 只看某个作者的贡献

$ git who --author "Alice Developer"

# 排除某个作者

$ git who --nauthor "Bot User"

```

### 技巧 2:时间范围过滤

```bash

# 只看最近 6 个月的贡献

$ git who --since "6 months ago"

# 只看某个时间段

$ git who --since "2024-01-01" --until "2024-12-31"

```

### 技巧 3:排除特定文件类型

```bash

# 排除 .c 文件

$ git who tree -- Parser/ ':!*.c'

# 排除测试文件

$ git who tree -- src/ ':!*test*'

```

### 技巧 4:结合 Git 别名

```bash

# 添加到 ~/.gitconfig

[alias]

who-tree = "!git who tree"

who-hist = "!git who hist"

who-stats = "!git who -l"

```

### 技巧 5:禁用缓存(调试用)

```bash

# 如果结果不对,可以禁用缓存重新计算

$ GIT_WHO_DISABLE_CACHE=1 git who

```

---

## 七、git-who vs git blame:什么时候用哪个?

| 场景 | 推荐工具 | 原因 |

|------|---------|------|

| 想知道某行代码是谁写的 | `git blame` | 精确到行级别 |

| 想知道整个模块是谁写的 | `git-who tree` | 文件树级别,更宏观 |

| 想了解项目贡献者排名 | `git-who table` | 统计表清晰直观 |

| 想了解项目演进历史 | `git-who hist` | 时间线视图 |

| 新接手项目,快速了解结构 | `git-who tree` | 一目了然 |

**最佳实践**:

- 🔍 **定位具体问题** → 用 `git blame`

- 📊 **了解整体情况** → 用 `git-who`

- 🕐 **分析历史演进** → 用 `git-who hist`

---

## 八、常见问题 FAQ

### Q1:git-who 会影响 Git 仓库吗?

**A**:完全不会!`git-who` 是只读工具,只读取 Git 历史,不会修改任何内容。

### Q2:大项目会很慢吗?

**A**:`git-who` 内置了缓存机制,第一次运行会慢一些,后续会很快。如果觉得慢,可以设置 `GIT_WHO_DISABLE_CACHE=1` 禁用缓存(但会更慢)。

### Q3:支持 Git mailmap 吗?

**A**:支持!如果你的仓库有 `.mailmap` 文件,`git-who` 会自动识别,合并同一个人的不同邮箱/名字。

### Q4:可以忽略某些提交吗?

**A**:可以!在仓库根目录创建 `.git-blame-ignore-revs` 文件,列出要忽略的提交哈希,`git-who` 会自动跳过。

### Q5:Windows 能用吗?

**A**:可以!从 [GitHub Releases](https://github.com/sinclairtarget/git-who/releases) 下载 Windows 版本即可。

---

## 九、结语 & 互动

`git-who` 虽然是个"小工具",但用好了,能让你在团队协作中事半功倍。

**记住**:

- ✅ 宏观视角用 `git-who`

- ✅ 微观定位用 `git blame`

- ✅ 两者结合,效率翻倍

---

### 📌 小调查

你平时用 `git blame` 多吗?有没有遇到过"这代码谁写的?"的灵魂拷问?

**欢迎在评论区分享你的 Git 使用心得!**

---

### 🔗 延伸阅读

- [Git 官方文档:git-blame](https://git-scm.com/docs/git-blame)

- [git-who 项目地址](https://github.com/sinclairtarget/git-who)

- [Git mailmap 文档](https://git-scm.com/docs/gitmailmap)

---

### ✨ 关注我们

如果你喜欢这类实用开发技巧,欢迎**点赞、转发**,并关注本公众号「**技术小难**」,每周分享一个提升生产力的小工具!

---

Last updated