lazygit 是什么
官方仓库:https://github.com/jesseduffield/lazygit
lazygit 是一个终端里的 git 图形界面(TUI)。大部分 git 操作按一两个键就能完成,不用再记命令。
为什么用它
- git 命令多,参数难记,敲起来也麻烦
- VS Code 自带的 git 功能有限,用起来不顺手
- 现在经常让多个 agent 并行开发,每个 agent 占一个 worktree。lazygit 对 worktree 支持得很好,可以随时切到某个 worktree 看改动、提交
安装
安装方式很多,详见 GitHub。这里只说 Mac 和 Windows。
Mac:
brew install lazygit
Windows:
建议直接从 https://github.com/jesseduffield/lazygit/releases 下载二进制文件,再把所在目录加到 PATH 环境变量里
界面
在仓库目录下运行 lazygit:

面板
左边是 5 个列表面板,右边的主窗口显示当前选中项的详情。
| 面板 | 按键 | 内容 |
|---|---|---|
| Status | 1 |
仓库名和当前分支 |
| Files | 2 |
工作区改动。tab:Worktrees、Submodules |
| Branches | 3 |
本地分支。tab:Remotes、Tags |
| Commits | 4 |
提交历史。tab:Reflog |
| Stash | 5 |
stash 列表 |
| 主窗口 | 0 |
文件的 diff / 提交的改动 |
| Command log | @ |
lazygit 实际执行的 git 命令 |
- 面板标题里用
-隔开的是 tab,按[]切换 - 文件前的符号和
git status -s一样:左列是暂存区状态,右列是工作区状态 - 最底下一行显示当前面板的常用键
Command log :每一步操作实际执行了哪些 git 命令,都记在这里。比如对 app.js 按两次 <space>:
Stage file
git add -- app.js
Unstage file
git rm --cached --force -- app.js
不确定某个操作做了什么,就看这里。
在面板之间切换
| 键 | 作用 |
|---|---|
1--5 |
跳到对应面板 |
← → / h l |
上一个 / 下一个面板 |
↑ ↓ / j k |
在列表里上下移动 |
[ ] |
切换 tab |
<enter> |
进入:文件进入暂存视图,提交进入文件列表 |
<esc> |
返回 / 取消 |
+ / _ |
切换屏幕模式(普通 / 半屏 / 全屏) |
? |
查看当前面板的全部快捷键 |
q |
退出 |
日常操作
新建分支
3 选中基准分支(比如 main),按 n,输入分支名后回车。
新分支基于选中的分支 创建,不一定是当前分支,建好后会自动切过去。想从某个历史提交拉分支:4 选中那个提交,按 n。

切换分支
- 本地分支:
3选中,按<space> - 切回上一个分支:
- - 按名字切换:
c - 远程分支:
3→]切到 Remotes →<enter>进入origin→ 选中分支按<space>,选 New local branch(Detached head 只是切过去看看,不建本地分支)
分支列表按最近使用排序,切换后顺序会变,按键前先看清光标在哪。


暂存
在 2 Files 面板:
| 键 | 作用 |
|---|---|
<space> |
暂存 / 取消暂存选中的文件 |
a |
全部暂存 / 全部取消暂存 |
<enter> |
进入文件,按块或按行暂存 |

只暂存部分改动 :按 <enter> 进入暂存视图
- 默认按块选择,
<space>暂存当前块 - 按行暂存:先按
a切换到行模式,再用v选择范围,<space>暂存 <tab>切到已暂存一侧,在那边按<space>就是取消暂存

提交
暂存好后按 c,填写标题,按 <tab> 切到描述(可以不写),回车提交。
| 键 | 作用 |
|---|---|
C |
用 git 配置的编辑器写提交信息 |
w |
跳过 hook 提交(--no-verify) |

修改最后一次提交(amend)
把漏掉的改动暂存,按 A,回车确认。提交信息保持不变,等价于 git commit --amend --no-edit。
在 Commits 面板选中任意一个提交按 A,也能把暂存的改动合进那个提交。

丢弃改动
单个文件 :选中后按 d
x:全部丢弃,包括已暂存的部分u:只丢弃未暂存的部分

整个工作区 :按 D
| 键 | 作用 |
|---|---|
x |
Nuke:已暂存、未暂存和未跟踪的文件全部丢弃 |
u |
丢弃未暂存的改动 |
c |
删除未跟踪的文件 |
S |
丢弃已暂存的改动 |
s / m / h |
git reset --soft / --mixed / --hard HEAD |
只想丢弃几行:<enter> 进入暂存视图,选中后按 d。
丢弃的未提交改动,z 也救不回来。
Stash
存起来 :在 Files 面板按 s,输入说明后回车。s 不会存未跟踪的文件 ,想连新文件一起存,按 S 选 including untracked files。
S 菜单里还有:keep index、只存已暂存的、只存未暂存的。
取回来 :5 选中一条
| 键 | 作用 |
|---|---|
g |
pop |
<space> |
apply |
d |
drop |
r |
重命名 |

重命名分支
3 选中分支,按 R,改好名字后回车(Ctrl+U 可以清空输入框)。
这只会改本地分支名。远程分支要自己处理:先用新名字推送一次,再到 Remotes 里删掉旧分支。

第一次推送新分支(设置上游)
新分支第一次按 P 时,lazygit 会弹框,里面已经填好了 origin 分支名,直接回车:
git push --set-upstream origin refs/heads/feat/search:feat/search
之后再按 p / P 就不会再问。如果 git 配置了 push.autoSetupRemote=true,第一次也不会弹框。
修改已有分支的上游:3 选中分支,按 u。

拉取(Pull)
在任意面板按 p,等价于 git pull --no-edit。用 merge 还是 rebase,取决于你的 pull.rebase 配置。
- 只 fetch 不合并:在 Files 面板按
f - 不切换分支,直接更新别的分支(比如 main):
3选中它,按f
分支名后面的 ↑2 ↓3 表示本地比远程多 2 个提交、少 3 个提交。

推送(Push)
在任意面板按 P。

rebase 或 amend 之后,本地和远程会分叉,lazygit 会提示 Your branch has diverged,回车就会强推,用的是 --force-with-lease。

合并分支(Merge)
先切到目标分支,在 3 选中要合并进来的分支,按 M:
| 选项 | 命令 |
|---|---|
| Regular merge(第一项) | git merge --no-edit,能快进就快进 |
| with merge commit | --no-ff,强制生成合并提交 |
| Squash merge and leave uncommitted | --squash,之后自己提交 |
| Squash merge and commit | --squash,并直接提交 |
一般直接回车选第一项。菜单下方会说明当前选项具体做什么,选之前看一眼。



squash merge 之后,git 不认为这个分支已经合并,删除分支时需要强制删除。
冲突的处理方式见下一节。
Rebase 和解决冲突
在功能分支上,3 选中 main,按 r:
sSimple rebase:一般选这个iInteractive rebasebRebase onto base branch
遇到冲突:
- 弹出
Conflicts!,选 View conflicts - 选中冲突文件,按
<enter> ↑↓选择一边,<space>采用,b两边都保留;←→在冲突之间跳转;e用编辑器打开- 全部解决后,lazygit 会问是否继续,回车
- 想放弃:
m→ abort
注意:rebase 时,HEAD 那一块是 main 的代码,下面那块才是你的提交,和 merge 时正好相反。

合并提交(Fixup / Squash)
在 4 Commits 面板选中提交:
ffixup:合并到下面那个提交,丢掉自己的提交信息ssquash:合并到下面那个提交,两条提交信息拼在一起
按 v 多选,可以一次合并多个。


改提交信息、删除提交、调整顺序
在 4 选中提交:
| 键 | 作用 |
|---|---|
r |
修改提交信息 |
R |
用编辑器修改提交信息 |
d |
删除提交 |
Ctrl+J / Ctrl+K |
下移 / 上移 |

这些操作都会改写历史,已经推送过的分支,之后需要强推。
撤销提交(Reset / Revert)
reset :在 4 选中要回到 的那个提交,按 g
mmixed:改动回到工作区ssoft:改动回到暂存区hhard:改动直接丢弃

revert :选中要撤销的提交,按 t。已经推送的提交用这种方式。

Cherry-pick
3选中来源分支,按<enter>查看它的提交- 选中提交,按
C复制(可以多选) <esc>返回,到4按V粘贴
按 Ctrl+R 清空已复制的提交。

删除分支
3 选中分支,按 d:
c:删除本地分支r:删除远程分支b:两边都删除
如果分支还没合并,lazygit 会再确认一次,确认后执行 git branch -D。

撤销与重做(z / Z)
按 z,确认框里会说明要撤销什么,回车即可。Z 是重做。
撤销不了的情况:丢弃的未提交改动、已经推送的内容、rebase 进行到一半。

搜索和过滤(/)
- 在列表里(Files、Branches、Stash、菜单等):是过滤,只留下匹配的项
- 在 Commits、diff 和暂存视图里 :是搜索,按
n/N跳到下一个 / 上一个
按 <esc> 退出。


按文件或作者查看提交 :在 Commits 面板按 Ctrl+S,选 Enter path to filter by,输入路径(按 <tab> 补全)。退出时再按 Ctrl+S,选 Stop filtering。

在 Files 面板按 Ctrl+B,可以按状态筛选文件。
总结
日常的 git 操作基本就是这些。不确定时看 Command log,操作失误先按 z。
速查表
| 面板 | 键 | 作用 |
|---|---|---|
| 任意 | p / P |
pull / push |
| 任意 | z / Z |
撤销 / 重做 |
| 任意 | / |
搜索或过滤 |
| 任意 | ? |
当前面板的全部快捷键 |
Files 2 |
<space> / a |
暂存选中文件 / 全部暂存 |
Files 2 |
<enter> |
按块、按行暂存 |
Files 2 |
c / A |
提交 / amend |
Files 2 |
d / D |
丢弃文件改动 / 重置菜单 |
Files 2 |
s / S |
stash / stash 菜单 |
Branches 3 |
n / <space> |
新建分支 / 切换分支 |
Branches 3 |
R / d |
重命名 / 删除 |
Branches 3 |
M / r |
merge / rebase |
Commits 4 |
f / s |
fixup / squash |
Commits 4 |
r / d |
改提交信息 / 删除提交 |
Commits 4 |
Ctrl+J / Ctrl+K |
下移 / 上移 |
Commits 4 |
g / t |
reset / revert |
Commits 4 |
C / V |
复制 / 粘贴提交 |
Commits 4 |
Ctrl+S |
按文件或作者筛选 |
Stash 5 |
g / <space> / d |
pop / apply / drop |
下一篇:高级篇
lazygit README 里列出的招牌功能,这篇没讲到的,放到下一篇:
- 交互式 rebase:
e停在某个提交上修改,B标记 base commit - 修改更早的提交:
A,配合Ctrl+F找到要修改的提交 - Custom patch:从提交里抠出几行改动
- Bisect
- 比较两个提交:
W - Commit graph
- Worktrees
- 自定义命令
- GitHub Pull Requests