lazygit 是一个跑在终端里的 Git 界面:一个 21337088 字节的 exe,进到任意 git 仓库就能用。左边五块面板列出状态 / 文件 / 分支 / 提交 / stash,右边是 diff 与命令日志,改暂存、切分支和看历史都用单键。

它解决的是「记得住概念,记不住参数」这件事。git 的三区结构谁都懂,真要撤销一次误加的暂存,还得去翻 reset 和 restore 的区别。lazygit 把每个动作做成一个键,键位表在界面上按 ? 就能看。

这次从解压到出图完整跑了一遍:解压 0.26 秒,版本命令 358 到 403 毫秒,ConPTY 里启动到第一帧 3100 毫秒,30 个提交的仓库打开后五个面板都正常渲染。

一个 exe,五块面板

官方 zip 7574703 字节,解开只有三个文件:lazygit.exe、README.md 和一份 LICENSE。解压 0.26 秒,没有安装向导,不写注册表,也不需要装 Go 运行时。

文件字节作用
lazygit.exe21337088主程序,单文件
README.md2477官方说明
LICENSE1070MIT
zip 整体7574703解压后 3 个文件

版本命令 0.36 秒,输出比预期长

lazygit --version 连跑三次分别是 403 毫秒、378 毫秒和 358 毫秒,第三次最快,说明第一次的差值来自系统缓存而不是程序本身。

# 三次耗时 403 / 378 / 358 毫秒
lazygit.exe --version
commit=63ab89fff478854deb4a35ef8902676b3cc5ca72, build date=2026-10-16T09:27:30Z,
build source=binaryRelease, version=0.66.2, os=windows, arch=amd64,
git version=2.55.0.windows.3

这一行里有三个字段值得看:build source 写 binaryRelease 表示是官方编译产物,git version 会取系统里那份 git,版本号则决定键位表有没有变化。

装之前先确认三件事

它体量小,但没有依赖清单,第一次用容易漏掉外部条件。下面三项是这个环境里实际成立的。

条件本次实测值不满足会怎样
系统Windows 10 22H2(19045.6466)Win7 起不来,官方只给 x64 与 arm64
外部 git2.55.0.windows.3没有 git.exe 直接报找不到仓库
终端conhost,132 列 34 行列太窄时右侧 diff 会挤成一列
授权MIT仓库内商用可以,不用单独谈

它不打包 git,只调用系统里那份。这一点和前几篇测过的单文件工具不一样:exe 只有 21337088 字节,因为所有 git 操作都委托给外部命令完成。

启动到看见仓库 3100 毫秒

测量方法是开一个 ConPTY,从下令开始读输出流,直到出现状态栏里的 Status 字样为止。这个数含 cmd.exe 与 ConPTY 建立的开销,比纯程序启动要高一截。

环节耗时毫秒说明
--version 第 1 次403 毫秒冷启动
--version 第 2 次378 毫秒差 25 毫秒
--version 第 3 次358 毫秒趋于稳定
ConPTY 首帧3100 毫秒含 cmd 与 PTY 建立

首帧慢在画五个面板

第一次渲染要一次拉四份数据:工作区状态、文件列表和本地分支,加上提交历史。仓库里有 30 个提交和 3 个分支,四份查询在 3100 毫秒里占掉大半。

仓库变大会更明显。提交上千条时它会按页读取,滚动到第 2 页才开始取下一批,所以启动时间不会随历史线性增长。

五块面板各管什么

默认界面的左侧从 1 到 5 编号,按数字键直接跳过去。每块面板都有自己的单键动作,键位写在面板底部的提示条上。

编号面板实测内容
1Statusrepo → master,显示当前分支与上游
2Files2 个改动加 1 个未跟踪文件
—仓库规模30 个提交、3 个分支
3Local branchesmaster、feature-a、feature-b 三条
4Commits29 条可见,底部写 1 of 29
5Stash空,底部写 0 of 0

面板之间按 1 到 5 直接跳

Tab 是往后翻,1 到 5 是直接定位。在 Files 面板里按空格暂存当前文件,这一条改动会从上面的 unstaged 区移到下面的 staged 区,右侧 diff 跟着变色。

实测那三个文件在界面上分别是 ?? newfile.txt、M notes.md,状态字符和 git status --short 的输出一致,没有另造一套符号。

界面语言默认跟着系统走

系统区域是中文时,它把界面画成中文:底部提示条写着「确认」「关闭」「复制到剪贴板」「捐赠」。第一次打开会以为下错了版本,其实是本地化生效了。

要英文界面就写一份配置,用 --use-config-file 指过去,不动全局设置。

gui:
  language: en
  nerdFontsVersion: ""

lazygit.exe --use-config-file config.yml

改完配置要重启进程

配置文件在启动时读一次,改完得退出再进。界面里按 q 退出,再执行同一条命令,提示条立刻变英文。中文界面上那几个词的位置会错位一两个字,英文界面更整齐。

nerdFontsVersion 留空是为了不用图标字体。装了 Nerd Font 再填版本号,分支和文件前面会多出图标,字符宽度会变化。

首次运行写两个文件

程序目录是干净的,用户数据落在 %LOCALAPPDATA%\lazygit。打开一次之后目录里就有两个文件。

文件字节内容
config.yml0空的用户配置,改设置时才写入
state.yml149最近仓库、版本号、弹窗状态
lastupdatecheck: 0
recentrepos:
    - D:\wb_cache\b3\repo
startuppopupversion: 5
lastversion: 0.66.2
customcommandshistory: []
hidecommandlog: false

149 字节里最有用的两行是 recentrepos 与 lastversion。前者记着上次打开的仓库,后者决定升级后要不要弹「新版本有哪些变化」。想彻底重来,删掉这个文件就行,下次启动会按默认值重建。

提交一次改动要按几下

用实测那个仓库走一遍完整流程,按键次数是可以数出来的。改动暂存之后按 c 打开提交信息框,写完按回车确认。

按键动作界面变化
空格暂存当前文件文件从 unstaged 移到 staged
c打开提交信息框底部弹出输入行
回车确认提交Commits 面板顶部多一条
P推送状态栏出现 push 进度
q退出回到命令行

没配用户名时提交会失败

新机器上第一次提交,它会把 git 的报错原文贴在底部:提示 author identity unknown,让你先设 user.email 和 user.name。这两个值不在 lazygit 的配置里,得写进 git 的 config。

git config --global user.name "Your Name"
git config --global user.email [email protected]

四个真会遇到的卡点

打开后满屏中文,以为是汉化版

系统区域是 zh-CN 时它自动本地化,提示条那几个词会占掉两倍宽度。要英文就在 config.yml 里写 language: en,重启进程生效。

进了目录却说找不到仓库

必须从仓库根目录或它的子目录启动。在仓库外面运行,界面能开但 Files 面板是空的,底部提示 no repo。先 cd 到仓库再执行 exe,或者用 lazygit -p 路径 指定。

状态栏显示改了,diff 却是空的

文件被 .gitattributes 标成了 binary 时,界面只显示字节数不显示行级 diff。把该规则改掉,或者对这个文件用 git diff --text 单独看。

--use-config-file 指错路径直接退出

路径不存在时它不报错也不进界面,只闪一下。用绝对路径,并且在命令行里确认文件名是 config.yml 而不是 config.yaml。

什么场景值得上

天天提交、又不想背参数的人最合适。一个 21337088 字节的 exe 放进 PATH,30 个提交的仓库打开 3100 毫秒,比开图形客户端省内存。

远程服务器上更明显。SSH 进去只有终端,图形 Git 客户端根本起不来,lazygit 解压就能跑,这也是它最主流的用法。

反过来,只偶尔拉一次代码、从不改历史的人,装它意义不大。git status 和 git log 两条命令能覆盖的场景,多一层界面反而慢。

项目数值
exe 字节21337088
示例仓库30 个提交 / 3 个分支
zip 字节7574703
启动到首帧3100 毫秒
一次提交的按键数2 个(空格加 c)