git-alias 1.2.30

A fast git alias tool with dual-style command support
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
# Git-Alias


一个快速的 Git 别名工具,支持两种调用方式。

## 特性


- **双模式调用**: 支持直接调用 (`gs`) 和 g 前缀调用 (`g s`)
- **142+ 内置别名**: 覆盖所有常用 git 操作
- **作者代码统计**: `g stat` 按作者聚合 commit 数、增删行数、文件数
- **AI 提交摘要**: `g msg` 用 claude/opencode/anthropic 生成版本变更摘要
- **自定义别名**: 通过 `~/.git-alias.toml` 添加自定义别名
- **Shell 补全**: 支持 bash、zsh、fish 补全脚本
- **高性能**: Rust 编译,启动时间 < 1ms

## 安装


```bash
cargo install git-alias
```

## 配置


### 添加到 PATH


将以下内容添加到 `.bashrc` 或 `.zshrc`:

```bash
export PATH="$HOME/.local/bin:$PATH"
```

## 使用方法


### 基本命令


```bash
# 直接调用 (必须以 g 开头)

gs          # git status
gba         # git branch --all
gcm         # git commit (interactive)
gcmm "msg"  # git commit -m "msg"

# 通过 g 前缀调用

g s         # git status
g ls        # git log --no-merges
g ba        # git branch --all
g cm "msg"  # git commit -m "msg"

# 注意: g gps 这种用法不支持,gps 以 g 开头只能用直接调用

```

### 子命令


```bash
g list              # 列出所有别名
g list push         # 过滤显示 push 相关别名
g completions bash  # 生成 bash 补全脚本
g init              # 创建配置文件
g install           # 安装所有别名命令
g stat              # 作者代码变更统计(默认全部历史)
g --help            # 显示帮助
```

### 作者代码统计


`g stat` 命令按作者聚合指定时间范围内的代码变更:

```bash
# 默认:全部历史,当前分支,全部作者

g stat

# 指定作者

g stat alice
g stat alice@x.com            # 按邮箱
g stat "alic*"                # 通配符
g stat "re:^alic"             # 正则
g stat -i ALICE               # 大小写不敏感

# 时间范围(默认全部历史)

g stat                        # 全部历史
g stat --today                # 今日
g stat --yesterday            # 昨日
g stat --week                 # 过去 7 天
g stat --month                # 过去 30 天
g stat --year                 # 过去 1 年
g stat --since=2024-01-01
g stat --since="2 weeks ago"

# 范围与分支

g stat main..HEAD             # 分支对比,空时自动 merge-base 回退
g stat -a                     # 所有本地分支

# 排除 merge

g stat --no-merges

# 显示日均变更行数(按作者实际提交日数计算)

g stat --month -v
g stat -v alice
```

**作者匹配语法**(位置前缀区分):

| 模式 | 示例 | 说明 |
|------|------|------|
| 精确匹配 | `alice` | Author name 完全相等(大小写敏感) |
| 邮箱匹配 | `alice@x.com` | Author email 完全相等 |
| 通配符 | `alic*` `ali?e` | `*` 任意序列,`?` 单字符 |
| 正则 | `re:^alic` | `re:` 前缀为正则 |

**选项**:

| 选项 | 说明 |
|------|------|
| `--today` | 今日 00:00 至今 |
| `--yesterday` | 昨日 00:00 ~ 今日 00:00 |
| `--week` | 过去 7 天 |
| `--month` | 过去 30 天 |
| `--year` | 过去 1 年 |
| (无时间参数) | 全部历史 |
| `--since <DATE>` | 起始时间(git 原生语法) |
| `--until <DATE>` | 截止时间(默认 HEAD) |
| `-a, --all-branches` | 所有本地分支(不含 remote) |
| `-i, --ignore-case` | 作者匹配大小写不敏感 |
| `--no-merges` | 排除 merge commit |
| `-v, --verbose` | 显示日均新增/删除/总变动行数(按作者实际提交日数) |

**注意**:
- `g msg` 类似,`A..B` 范围为空时自动用 `merge-base` 找到分叉点
- `--since/--until``A..B` range 互斥
- `--today/--yesterday/--week/--month` 互斥,且不能与 `--since/--until` 同用
- 百分比以**区间内全部 commit** 为分母(即使用户按作者过滤)
- `added%` = added / total_added,`removed%` = removed / total_removed,`lines%` = lines / total_lines
- `--verbose` 额外显示 `days`(作者实际提交日数),以及 `added/day` / `removed/day` / `lines/day`
- 日均值按作者实际提交日数计算;合计行(total)的 `days` 为所有作者活跃日数之和

**输出示例**(默认,全部历史):

```
代码变更统计 (全部历史 · 当前分支)  2024-01-15 ~ 2025-08-12
┌─────────────┬─────────┬──────────┬───────┬────────┬─────────┬──────────┬───────┬────────┬───────┬────────┐
│ author      │ commits │ commits% │ added │ added% │ removed │ removed% │ lines │ lines% │ files │ files% │
╞═════════════╪═════════╪══════════╪═══════╪════════╪═════════╪══════════╪═══════╪════════╪═══════╪════════╡
│ Alice Wang  │ 42      │ 47.7%    │ +1820 │ 58.4%  │ -320    │ 39.3%    │ 2140  │ 52.3%  │ 87    │ 48.6%  │
│ Bob Chen    │ 18      │ 20.5%    │ +640  │ 20.5%  │ -180    │ 22.1%    │ 820   │ 20.0%  │ 45    │ 25.1%  │
│ cnzf1       │ 16      │ 18.2%    │ +540  │ 17.3%  │ -95     │ 11.7%    │ 635   │ 15.5%  │ 28    │ 15.6%  │
├═════════════╪═════════╪══════════╪═══════╪════════╪═════════╪══════════╪═══════╪════════╪═══════╪════════╣
│ total       │ 88      │ 100.0%   │ +3115 │ 100.0% │ -815    │ 100.0%   │ 3930  │ 100.0% │ 179   │ 100.0% │
└─────────────┴─────────┴──────────┴───────┴────────┴─────────┴──────────┴───────┴────────┴───────┴────────┘
```

**输出示例**(`g stat --month -v`):

```
代码变更统计 (过去 30 天 · 当前分支)  2025-07-15 ~ 2025-08-12
┌─────────────┬─────────┬──────────┬──────┬───────┬────────┬───────────┬─────────┬──────────┬─────────────┬───────┬────────┬───────────┬───────┬────────┐
│ author      │ commits │ commits% │ days │ added │ added% │ added/day │ removed │ removed% │ removed/day │ lines │ lines% │ lines/day │ files │ files% │
╞═════════════╪═════════╪══════════╪══════╪═══════╪════════╪═══════════╪═════════╪══════════╪═════════════╪═══════╪════════╪═══════════╪═══════╪════════╡
│ Alice Wang  │ 42      │ 47.7%    │ 5    │ +1820 │ 58.4%  │ +364      │ -320    │ 39.3%    │ -64         │ 2140  │ 52.3%  │ 428       │ 87    │ 48.6%  │
│ Bob Chen    │ 18      │ 20.5%    │ 3    │ +640  │ 20.5%  │ +213      │ -180    │ 22.1%    │ -60         │ 820   │ 20.0%  │ 273       │ 45    │ 25.1%  │
│ cnzf1       │ 16      │ 18.2%    │ 3    │ +540  │ 17.3%  │ +180      │ -95     │ 11.7%    │ -32         │ 635   │ 15.5%  │ 212       │ 28    │ 15.6%  │
├═════════════╪═════════╪══════════╪══════╪═══════╪════════╪═══════════╪═════════╪══════════╪═════════════╪═══════╪════════╪═══════════╪═══════╪════════╣
│ total       │ 88      │ 100.0%   │ 11   │ +3115 │ 100.0% │ +283      │ -815    │ 100.0%   │ -74         │ 3930  │ 100.0% │ 357       │ 179   │ 100.0% │
└─────────────┴─────────┴──────────┴──────┴───────┴────────┴───────────┴─────────┴──────────┴─────────────┴───────┴────────┴───────────┴───────┴────────┘
```

### AI 提交摘要


`g msg` 命令调用 AI 工具自动生成版本变更摘要:

```bash
# 分析两个分支之间的变更

g msg release/v0.3.4..release/v0.3.5

# 分析两个 commit 之间的变更

g msg db8201ed..8a61f32a

# 分析最近 N 个提交

g msg HEAD~10..HEAD

# 在每条变更后追加作者信息 <作者名>

g msg -v HEAD~10..HEAD
g msg --verbose release/v0.3.4..release/v0.3.5
```

**注意**:
- `A..B` 范围为空时,会自动使用 `merge-base` 找到分叉点,显示分叉后 B 的新提交
- 如果分支不存在,提示使用 `origin/feature/xxx` 远程分支名,或用 `git branch -a` 查看所有分支

**输出示例:**

```markdown
## 版本变更摘要 (release/v0.3.4 → release/v0.3.5)


### 🐛 Bug 修复

- **打包问题**:修复 PR #66 引入的无法启动问题

### ✨ 新功能

- **分析**:客户端可开启显示,实时展示分析结果
- **广场**:新增广场界面

### 🔧 优化与重构

- **Kernel 更新**:合并最新 kernel

### 📝 其他

- 版本更新至 **0.3.5**
```

开启 `-v` 时,每条变更末尾追加作者信息:

```markdown
### ✨ 新功能
- **分析** <张三>: 客户端可开启显示,实时展示分析结果
- **广场** <李四>: 新增广场界面
```

### 配置管理


配置文件位于 `~/.config/git-alias.toml`(旧配置 `~/.git-alias.toml` 会自动迁移)。

```bash
# 查看所有配置

g config

# 获取配置值

g config get msg.provider

# 设置配置值

g config set msg.provider=openai
g config set msg.openai.api_key=sk-...
g config set msg.openai.model=gpt-4o

# 重新生成默认配置文件(已存在时会提示确认覆盖)

g config new
```

**AI Provider 配置**:

| Provider | 说明 |
|----------|------|
| `tool` | 使用 claude/opencode 等本地工具(默认) |
| `openai` | 使用 OpenAI API |
| `anthropic` | 使用 Anthropic API |

**示例配置**:

```toml
[msg]
provider = "openai"

[msg.openai]
model = "gpt-4o-mini"
api_key = "sk-..."
base_url = "https://api.openai.com/v1"

[msg.anthropic]
model = "claude-3-5-sonnet-20241022"
api_key = "sk-ant-..."
base_url = "https://api.anthropic.com"
```

## 别名列表


运行 `g list` 查看所有别名。

> **调用规则**:
> - 直接调用(如 `gs`, `gps`, `gba`):必须以 `g` 开头
> - `g` 前缀调用(如 `g s`, `g ps`, `g ba`):别名不能以 `g` 开头
> - `g` 开头的别名不支持 `g` 前缀调用(如 `g gps` 报错)

### Add (添加)

| 别名 | 命令 |
|------|------|
| `g a` | git add |
| `ga` | git add |
| `g aa` | git add . |
| `gaa` | git add . |

### Status (状态)

| 别名 | 命令 |
|------|------|
| `g s` | git status |
| `gs` | git status |
| `g ss` | git status -s |
| `gss` | git status -s |
| `g sb` | git status -s -b |
| `gsb` | git status -s -b |

### Commit (提交)

| 别名 | 命令 |
|------|------|
| `g cm` | git commit |
| `gcm` | git commit |
| `g cma` | git commit --amend |
| `gcma` | git commit --amend |
| `g cmn` | git commit --no-edit --amend |
| `gcmn` | git commit --no-edit --amend |
| `g cmm` | git commit -m |
| `gcmm` | git commit -m |
| `g cmai` [-en] | git commit (AI auto message, `-en` for English) |
| `gcmai` [-en] | git commit (AI auto message, `-en` for English) |

### Push (推送)

| 别名 | 命令 |
|------|------|
| `g ps` | git push |
| `gps` | git push |
| `g psf` | git push --force-with-lease |
| `gpsf` | git push --force-with-lease |
| `g psu` | git push -u origin HEAD |
| `gpsu` | git push -u origin HEAD |

### Pull (拉取)

| 别名 | 命令 |
|------|------|
| `g p` | git pull |
| `gp` | git pull |
| `g pl` | git pull |
| `gpl` | git pull |
| `g pla` | git pull --all -t |
| `gpla` | git pull --all -t |

### Branch (分支)

| 别名 | 命令 |
|------|------|
| `g b` | git branch |
| `gb` | git branch |
| `g ba` | git branch --all |
| `gba` | git branch --all |
| `g bra` | git branch -avv |
| `gbra` | git branch -avv |
| `g bv` | git branch -vv |
| `gbv` | git branch -vv |
| `g bc` | git branch --contains |
| `gbc` | git branch --contains |
| `g bcr` | git branch -r --contains |
| `gbcr` | git branch -r --contains |
| `g bd` | git branch -d |
| `gbd` | git branch -d |
| `gbD` | git branch --delete --force |

### Checkout (检出)

| 别名 | 命令 |
|------|------|
| `g ck` | git checkout |
| `gck` | git checkout |
| `g ckb` | git checkout -b |
| `gckb` | git checkout -b |

### Switch (切换)

| 别名 | 命令 |
|------|------|
| `g sw` | git switch |
| `gsw` | git switch |
| `g swc` | git switch --create |
| `gswc` | git switch --create |
| `g swd` | git switch --detach |
| `gswd` | git switch --detach |
| `g swf` | git switch --force |
| `gswf` | git switch --force |

### Log (日志)

| 别名 | 命令 |
|------|------|
| `g l` | git log (自定义格式) |
| `gl` | git log (自定义格式) |
| `g lg` | git log -S <string> |
| `glg` | git log -S <string> |
| `g lgg` | git log -G <pattern> |
| `glgg` | git log -G <pattern> |
| `g ls` | git log --no-merges |
| `gls` | git log --no-merges |
| `g lss` | git log --no-merges --stat=200 |
| `glss` | git log --no-merges --stat=200 |
| `g lp` | git log --oneline --color -p |
| `glp` | git log --oneline --color -p |

### Diff (差异)

| 别名 | 命令 |
|------|------|
| `g d` | git diff |
| `gd` | git diff |
| `g di` | git diff |
| `gdi` | git diff |
| `g dc` | git diff --cached |
| `gdc` | git diff --cached |
| `g ds` | git diff --stat=200 |
| `gds` | git diff --stat=200 |
| `g dw` | git diff --word-diff |
| `gdw` | git diff --word-diff |

### Reset/Restore (重置/恢复)

| 别名 | 命令 |
|------|------|
| `g rs` | git reset |
| `grs` | git reset |
| `g rsh` | git reset --hard |
| `grsh` | git reset --hard |
| `g rss` | git reset --soft |
| `grss` | git reset --soft |
| `g un` | git restore |
| `gun` | git restore |
| `g uns` | git restore --staged |
| `guns` | git restore --staged |

### Revert (回退)

| 别名 | 命令 |
|------|------|
| `g rvr` | git revert |
| `grvr` | git revert |

### Stash (储藏)

| 别名 | 命令 |
|------|------|
| `g st` | git stash |
| `gst` | git stash |
| `g stp` | git stash pop |
| `gstp` | git stash pop |
| `g sta` | git stash apply |
| `gsta` | git stash apply |
| `g stl` | git stash list |
| `gstl` | git stash list |
| `g std` | git stash drop |
| `gstd` | git stash drop |

### Remote (远程)

| 别名 | 命令 |
|------|------|
| `g r` | git remote |
| `gr` | git remote |
| `g rv` | git remote -v |
| `grv` | git remote -v |
| `g ra` | git remote add |
| `gra` | git remote add |
| `g rd` | git remote remove |
| `grd` | git remote remove |

### Fetch (获取)

| 别名 | 命令 |
|------|------|
| `g f` | git fetch |
| `gf` | git fetch |
| `g fa` | git fetch --all --prune |
| `gfa` | git fetch --all --prune |

### Merge (合并)

| 别名 | 命令 |
|------|------|
| `g m` | git merge |
| `gm` | git merge |
| `g mf` | git merge --ff-only |
| `gmf` | git merge --ff-only |
| `g mo` | git merge -Xtheirs |
| `gmo` | git merge -Xtheirs |
| `g mm` | git merge -Xours |
| `gmm` | git merge -Xours |

### Rebase (变基)

| 别名 | 命令 |
|------|------|
| `g rb` | git rebase |
| `grb` | git rebase |
| `g rbi` | git rebase -i |
| `grbi` | git rebase -i |
| `g rbc` | git rebase --continue |
| `grbc` | git rebase --continue |
| `g rbun` | git rebase --abort |
| `grbun` | git rebase --abort |
| `g rbvi` | git rebase --edit-todo |
| `grbvi` | git rebase --edit-todo |
| `g rbsk` | git rebase --skip |
| `grbsk` | git rebase --skip |

### Clone (克隆)

| 别名 | 命令 |
|------|------|
| `clo` | git clone |
| `gclo` | git clone |
| `clob` | git clone -b |
| `gclob` | git clone -b |

### Tag (标签)

| 别名 | 命令 |
|------|------|
| `g t` | git tag |
| `gt` | git tag |
| `g tl` | git tag -l |
| `gtl` | git tag -l |
| `g tn` | git tag -n |
| `gtn` | git tag -n |
| `g ta` | git tag -a |
| `gta` | git tag -a |

### Blame (追溯)

| 别名 | 命令 |
|------|------|
| `g bl` | git blame |
| `gbl` | git blame |

### Worktree (工作树)

| 别名 | 命令 |
|------|------|
| `g w` | git worktree |
| `gw` | git worktree |
| `g wa` | git worktree add |
| `gwa` | git worktree add |
| `g wrm` | git worktree remove |
| `gwrm` | git worktree remove |
| `g wl` | git worktree list |
| `gwl` | git worktree list |
| `g wlck` | git worktree lock |
| `gwlck` | git worktree lock |
| `g wun` | git worktree unlock |
| `gwun` | git worktree unlock |

### Clean (清理)

| 别名 | 命令 |
|------|------|
| `cln` | git clean --interactive -d |
| `gcln` | git clean --interactive -d |
| `g clnf` | git clean -d --force |
| `gclnf` | git clean -d --force |
| `g clnfx` | git clean -d --force -x |
| `gclnfx` | git clean -d --force -x |

## 配置文件


创建配置文件 `~/.git-alias.toml`:

```bash
g init
```

### 配置示例


```toml
[aliases]
# 自定义别名 (覆盖内置别名)

my = ["status", "-s", "-b"]
pushf = ["push", "--force-with-lease"]
wip = ["add", "-A"]

[settings]
# 默认分支名

main_branch = "main"

# 详细模式 (显示执行的命令)

verbose = false
```

## Shell 补全


### Bash


```bash
source <(g completions bash)
```

添加到 `.bashrc` 以持久化:

```bash
source <(g completions bash)
```

### Zsh


```bash
source <(g completions zsh)
```

添加到 `.zshrc` 以持久化:

```bash
source <(g completions zsh)
```

### Fish


```bash
g completions fish > ~/.config/fish/completions/g.fish
```

## 性能


- 二进制大小: ~3.8MB (release 编译,含 line-tables 调试信息)
- 启动时间: < 1ms (CPU 时间)
- 内存占用: < 3MB

## 许可证


MIT