lazygit 上手:日常 git 操作一篇讲完

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:

  • s Simple rebase:一般选这个
  • i Interactive rebase
  • b Rebase onto base branch

遇到冲突:

  1. 弹出 Conflicts!,选 View conflicts
  2. 选中冲突文件,按 <enter>
  3. ↑ ↓ 选择一边,<space> 采用,b 两边都保留;← → 在冲突之间跳转;e 用编辑器打开
  4. 全部解决后,lazygit 会问是否继续,回车
  5. 想放弃:m → abort

注意:rebase 时,HEAD 那一块是 main 的代码,下面那块才是你的提交,和 merge 时正好相反。

合并提交(Fixup / Squash)

在 4 Commits 面板选中提交:

  • f fixup:合并到下面那个提交,丢掉自己的提交信息
  • s squash:合并到下面那个提交,两条提交信息拼在一起

按 v 多选,可以一次合并多个。

改提交信息、删除提交、调整顺序

在 4 选中提交:

键 作用
r 修改提交信息
R 用编辑器修改提交信息
d 删除提交
Ctrl+J / Ctrl+K 下移 / 上移

这些操作都会改写历史,已经推送过的分支,之后需要强推。

撤销提交(Reset / Revert)

reset :在 4 选中要回到 的那个提交,按 g

  • m mixed:改动回到工作区
  • s soft:改动回到暂存区
  • h hard:改动直接丢弃

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

Cherry-pick

  1. 3 选中来源分支,按 <enter> 查看它的提交
  2. 选中提交,按 C 复制(可以多选)
  3. <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
相关推荐
codigger2 小时前
大厂git提交规范
git·程序员
挖掘狂人2 小时前
六条分支,一条主干:我的 Git 分支管理心得
git·后端·程序员
Brookty3 小时前
Git与GitHub系统学习|本地Git工作模型:终端与进程、CWD、HEAD/Index/工作树及Git对象
git·github
2301_7671139818 小时前
点过“不再询问”就要检查:Claude Code权限文件也可能存着密钥
git·信息安全·claude code
江屿风1 天前
【Git-组件】【Git入门:从文档灾难到版本掌控】流食般投喂
运维·笔记·git·组件·版本控制
程序员沉梦听雨1 天前
【Git】fork工作流与上游同步
git
高调的涵涵4 天前
删了1.2GB,.git仍是1.2GB
git
程序员沉梦听雨4 天前
【Git】git-submodule子模块管理
git
全栈陈序员5 天前
Git】从入门到精通(八)—— git log:查看提交历史
大数据·git·elasticsearch