lazygit的学习与使用
lazygit Learning
1. Lazygit背景
Git的强大是所有开发者心中的利器
LazyGit 是一个使用 Go 语言编写的终端界面 Git 客户端,它以一种轻量级、高效且用户友好的方式提供了对 Git 仓库的全面管理.
它能为 git 命令提供一个终端图形界面,用户可以通过键盘快捷键或鼠标快速地完成各种 Git 操作,如提交、合并、推送、查看或切换分支等。
Lazygit = 多个panel+光标焦点+上下文快捷键
- 0 是状态显示栏,0不是Git视图,而是lazygit的UI交互层
- 1 仓库状态 是lazygit的全局健康检查层
- 2 工作区/文件/子模块(Working Tree/index/submodules)
- 3 引用(Refs) 是分支层,包括本地分支、远程分支、标签等
- 4 提交&引用日志(Commits & Reflog) 是提交层,包括提交历史、引用日志等
- 5 贮藏&命令执行日志(Stash & Command log) 是暂存层,包括暂存列表、暂存操作等
Working Tree
↓
Index
↓
Refs
↓
Commits
↓
Reflog
↓
Stash编号0-5编号对应着lazygit默认的窗口索引,在Lazygit中,你可以直接通过键盘上的数字键0-5在这些层级之间快速的条约,0作为全局状态和日志的反馈
2. Lazygit安装
官网提供了多种系统版本和安装方式,下面提供常见系统的个别安装,具体的请参考官方github
brew install lazygit# Add the extras bucket
scoop bucket add extras
# Install lazygit
scoop install lazygit使用gah/go进行安装
# gah
gah install lazygit
# go
go install github.com/jesseduffield/lazygit@latest3. Lazygit基础使用
- git add 操作
- git commit 操作
- git branch 操作
3.1 git add 修改操作
假设你修改了文件,并进行Ctrl+S保存,lazygit会自动检测到你的修改,最好是多改几个文件,多修几行
- 在[2]中File-Worktrees-Submodules中的
File中,可以看到当前修改的文件是01-基础教程,前面有M表示正在修改
- 你可以直接使用
Space空格键,直接相当于git add file.txt文件 - 你可以使用
a,表示直接使用git add ./ - 再按一次
a或者space,相当于git restore取消暂存
- 点击当前的文件,然后按
Enter回车键,进入文件修改界面 - 就是[0]状态栏中显示的样子(分为Ubstaged changes和Staged Changes)
@@ -a,b +c,d @@ 表示: 旧文件从第 a 行开始的 b 行,被新文件中从第 c 行开始的 d 行替换,可以理解为-(a,b),然后+(c,d), 这个是指缩略,每行改了都是变动
-72,4:表示在旧版本的文件中,从第 72 行开始,往下连续 4 行构成了这个修改区块。
+72,6:表示在新版本的文件中,从第 72 行开始,往下连续 6 行构成了这个修改区块。
每一个
@@..@@都是一个hunk,光标停在某在hunk上
| 操作 | 按键 |
|---|---|
| stage 当前 hunk | space |
| discard 当前 hunk | d |
| 全文件 stage | 回到文件列表 space |
这就是lazygit推荐的最小修改单位
当然你可以使用VSCode,进行精细的编辑,但是终端就是讲究效率,同时忠于git
在[0]区域就可以就行当行的修改,主要是分为Ubstaged changes和Staged Changes,能看到自己修改了哪部分,然后选择性的先进行git add
3.2 git commit操作
在上一步进行修改和git add之后,就是进行git commit操作了
选中文件之后,按c键,会看到commit要求的message提示
- 添加commitxx信息,然后按
Enter回车键,进行commit操作 相当于git commit -m "message0" - description可以不写,但是最好写上,方便后续的回溯
如何使用git commit -amend?
Lazygit给了更方便的操作,在[04]工作栏中点击commit,然后会出现Amend commit提示,点击确定即可追加commit,commit的信息不变,但是commit的hash会发生改变
仅仅修改提交信息
如果你代码没问题,只是觉得刚才的 Commit Message 写得太烂(或者有错别字),请按以下步骤操作:
- 按 4 进入 Commits 面板。(或者点击4的commit即可)
- 选中最顶端的那条提交(也就是你刚刚完成的那条)。
- 按
r进入修改信息界面。修改之后按Enter确认即可
高级操作
- 只提交一部分修改
- [02]选择文件
Enter进入git diff界面- 在某个块上保存,然后按
Enter回车键,会自动git add,然后按c键,进行commit操作 这样就可以将一个文件拆分多个commit
同样的道理也可用于每一行的操作,主要指修改的部分
在点击[04]部分的commit之后,底部出现了很多功能性提示,包括commit的操作,如果忘记了操作可按照下方点击
Reword:r用来修改commit信息Drop:d用来删除commit,删除commit的同时修改的内容也会退回Amend:A用来追加commit,追加commit的同时修改的内容也会退回Fixup:f用来修改commit信息,同时删除commit
这是单commit的应用,后面介绍多个commit合并处理的方法
3.3 git branch
分支是git的核心,也是git的精髓
创建分支
在文件目录中进入bash,输入lazygit,切换到lazygit界面
在[03]的工作区域,点击Local branch,最下方会有提示
checkout; New Branch; delete; Rebase; Reset; Upsteam; Merge; Stash; Rename
- 按
n进入到创建分支的界面,输入分支的名称,确认Enter就可,默认直接切换到dev分支,等价于git switch -c dev或旧版的命令git checkout -b dev
切换分支
而构建分支之后,如何切换? - 按Space(空格) 是最稳妥的切换和检出(checkout) - 按Enter现在就是展开commit,而不是切换了,需要注意 - 如果进入预览了,按Esc或q 即可回到左侧的分支选择列表
修改分支的名字,需要记住rename和rebase非常容易混淆,快捷键R对应着rename;而常用的r对应着rebase
R等价于git branch -m old-name new-namer等价于git rebase
按照上面的操作继续在[02]Flies,使用
Space+c+Enter,进行提交,完成一次分支文件的修改
合并分支
在feature(dev改命)分支下,继续创建一个bugfix分支,然后修改文件,在创建的瞬间就能看到commit 9a26c6b将(HEAD–> bugfix,feature)表示HEAD当前的进度
- bugfix分支修改之后,进行快速操作,就看到
commit a110f7f(HEAD –> bugfix),这就是HEAD指向最前端的精髓 - 点击每一个分支都展现出来当前分支的commit 线路
- 在[03]工作区域,点击
Local branch,选择feature分支,然后按space切换分支到feature - 按
M表示merge分支(下方都有提示,如果忘记了可以查看下方),会出现多种提示- Regular merge(fast - forward) 快进模式 m
- Regular merge(no fast - forward) 普通模式 带有commit信息 n
- Squash merge and leave uncommitted s
- Squash merge and commit s
feature: A──B
bugfix: └──C──D快进模式 feature没有新的提交,只是落后于bugfix,只是把 feature 指针“快进”到 D
普通模式 feature有新的提交,需要把feature的提交合并到bugfix,所以需要一个新的commit,表示合并
压缩模式不提交 feature有新的提交,需要把feature的提交合并到bugfix,但是不需要新的commit,直接把feature的提交压缩到bugfix,等价于
git merge --squash feature,需要你手动commit压缩并提交 C+D压缩成一个commit 等价于
git commit --squash feature+git commit
删除分支
使用完分支之后,记得删除,否则分支会越来越多,越来越乱。
- 选中需要删除的分支,按
d,就会出现提示 - 之前还需要确定删除本地分支,远程分支这些,lazygit全部呈现出来,给你选择
- Delete local branch
- Delete remote branch
- Delete local and remote branch
- 删除之后,按
Enter确认即可
3.4 git commit 高级操作
squash就是压缩的意思,将多个commit压缩成一个commit,在开发中,经常需要将多个commit压缩成一个commit,方便后续的回溯
在Lazygit中,Commits和Reflog在[04]区域,相互配合使用提升效率
假设
a.md中,一次添加了三行的内容,并且分别commit三次test A, B, C
@@-1,3 +1,5@@ 含义@@ -旧文件起始行号,旧文件行数 +新文件起始行号,新文件行数 @@ - -1,3表示旧的文件是1,3行 - +1,5表示新的文件是1,5行
- Amend追加commit
在修改完之后,不想新增commit,而是想合并到其他的commit,把文件在lazygit[2]区域,按空格或a全部保存后,在[04]区域找到需要追加commit的commit,按A进入修改commit信息界面,按Enter确认即可
在最下方能看到部分的功能快捷键,如果需要更多的可以使用
?
Reword:r用来修改commit信息,选中一个commit按r进入修改信息界面,修改之后按Enter确认即可
- Reset撤回到某commit
选中要跳回的commit,按g进入回退选项,三种模式Mix:撤销git add和git commit只保留文件修改,Soft: 保留git add和Hard:全部不保留,全部撤销
在[04]区域Commits-Reflog中, Commits表示commit历史,Reflog(Reference Log)表示git的日志,可以查看git的日志,包括git的回退,git的合并等
- 图中[0]区域,能看到HEAD–>main,重新到了当前的commit,文件内容也全部显示为第一个commit的内容
- 图中[4]Reflog区域,
reset: moving to e823xxxx
reflog保存在.git/logs/HEAD在,里面其实就是文本,旧hash,新hash操作
只会默认保留一段时间,而不是一直保留
在Reflog中选择要回转的commit,然后按g reset,选择Mix模式,回退到之前的commit,但是文件内容还是修改后的内容,因为git add了,相当于倒过来了,按照Mix,soft和hard,一个是保留,一个是恢复
- Revert 快捷反向操作commit
git revert更像是对某一个commit的直接撤销反转操作
比如A-->B-->C三个commit,现在想撤销B,但是不想撤销A和C,就可以使用git revert,相当于A-->B'-->C,B’是B的反转,但是B’的commit信息是revert B,这样就能知道是撤销了B,不需要你再做git add,commit信息
记住git有哪些可用操作,找不到快捷键的话,就按?,会跳出来操作说明
如果一个地方的内容,被多个commit修改过的话,
git revert是非常容易发生冲突的
- Squash压缩commit功能
Lazygit提供了两种
Squash和Fix up两种压缩commit的方式
- Fix up压缩commit
“这个提交其实只是修复前面某个提交的,不值得单独保留历史。”
比如你提交A → B → C,你已经全部都提交了,但是你发现B这个提交其实只是修复A的,不值得单独保留历史,那么就可以使用Fix up,将B压缩到A,变成A → C,相当于追加在某个commit后的压缩,操作性比较固定
自动应用 Fixup (S):如果你之前已经创建过 fixup 提交,可以直接按大写的 S 键,lazygit 会自动帮你把对应的 fixup 提交压缩应用到目标提交上。
- Squash交互式操作
单独使用Squash是和Fixup类似的,也是将commit的合并,但是
Squash是可以保留commit的,会合并到另外一条commit中
但是Squash是交互式的,可以手动选择哪些commit需要压缩,哪些不需要压缩
- 按ii键进入交互式模式,每一行都代表一个commit
- 在commits区域,pick表示保留, 点击pick然后按
s,表示选中的commit需要压缩,保留多个commit message编辑;点击pick然后按f,表示选中的commit需要压缩,但是直接丢弃commit的message
- 下方有提示
View rebase option: m,按m键
- 能看到
Squash之后commit被压缩到到下方的commit中
撤销上一步操作 (Undo):按下小写字母
z键。这可以帮你撤销刚刚完成的 squash 操作,恢复原来的提交历史。
















