Git 速成指南:从入门到撤销、分支协作与故障恢复
欢迎你来读这篇博客。本文是一份面向日常开发的 Git 速成指南与命令速查表,覆盖仓库初始化、提交、分支、合并、变基、远程协作、撤销误操作、文件忽略、历史恢复和常见工程实践。
阅读完本文,你应该能够快速判断:
- 文件现在位于工作区、暂存区,还是已经提交;
- 修改错了、提交错了、推送错了,分别该用什么命令;
reset、restore、revert、checkout到底有什么区别;- 如何正确使用分支、合并、变基和远程仓库;
- 如何把已经被 Git 跟踪的文件移出索引,但保留本地文件。
序言
Git 最难的地方通常不是命令多,而是同一个“撤销”动作,在不同阶段需要使用完全不同的命令。
先记住 Git 的四个核心区域:
- 工作区(Working Tree):你正在编辑的文件。
- 暂存区(Index / Staging Area):下一次提交准备包含的内容。
- 本地仓库(Local Repository):已经通过
commit保存的历史。 - 远程仓库(Remote Repository):GitHub、GitLab、Gitee 等服务器上的仓库。
flowchart LR
A[工作区<br/>Working Tree] -->|git add| B[暂存区<br/>Index]
B -->|git commit| C[本地仓库<br/>Local Repository]
C -->|git push| D[远程仓库<br/>Remote Repository]
B -->|git restore --staged| A
C -->|git reset| B
D -->|git fetch / git pull| C
Git 操作的本质,就是让文件和提交在这些区域之间移动。
正文
1. Git 基础配置
1.1 查看 Git 版本
1 | |
1.2 配置用户名和邮箱
全局配置:
1 | |
仅配置当前仓库:
1 | |
1.3 查看配置
查看全部配置:
1 | |
查看配置来源:
1 | |
查看单项配置:
1 | |
1.4 设置默认分支名称
1 | |
1.5 设置默认编辑器
使用 Vim:
1 | |
使用 VS Code:
1 | |
1.6 常用别名
1 | |
以后可以直接执行:
1 | |
2. 创建和获取仓库
2.1 初始化仓库
1 | |
指定默认分支:
1 | |
2.2 克隆远程仓库
1 | |
指定本地目录:
1 | |
克隆指定分支:
1 | |
浅克隆,只获取最近一次历史:
1 | |
3. Git 日常操作流程
最常见的开发流程:
1 | |
flowchart TD
A[拉取最新代码] --> B[创建或切换功能分支]
B --> C[修改代码]
C --> D[git status / git diff]
D --> E[git add]
E --> F[git commit]
F --> G[git pull --rebase]
G --> H[解决可能的冲突]
H --> I[git push]
I --> J[创建 Pull Request]
3.1 查看仓库状态
1 | |
精简输出:
1 | |
常见状态标记:
| 标记 | 含义 |
|---|---|
?? |
未跟踪文件 |
A |
新增并已暂存 |
M |
文件已修改 |
D |
文件已删除 |
R |
文件被重命名 |
左侧 M |
暂存区有修改 |
右侧 M |
工作区有修改 |
3.2 查看修改内容
查看工作区与暂存区的差异:
1 | |
查看暂存区与最后一次提交的差异:
1 | |
也可以写成:
1 | |
查看某个文件:
1 | |
查看两个提交之间的差异:
1 | |
查看两个分支之间的差异:
1 | |
3.3 添加文件到暂存区
添加指定文件:
1 | |
添加多个文件:
1 | |
添加当前目录全部变化:
1 | |
添加整个仓库全部变化:
1 | |
只添加已被跟踪文件的修改和删除,不添加新文件:
1 | |
交互式选择部分修改:
1 | |
git add -p 非常适合把一个大修改拆成多个逻辑清晰的提交。
3.4 提交修改
普通提交:
1 | |
打开编辑器填写详细提交信息:
1 | |
提交所有已被跟踪文件的修改:
1 | |
注意:-a 不会自动添加未跟踪的新文件。
修改最近一次提交:
1 | |
修改最近一次提交信息:
1 | |
只修改提交信息,不改提交内容:
1 | |
准确地说,--no-edit 是保留原提交信息并重新生成提交,常用于补加漏掉的文件:
1 | |
如果提交已经推送到共享分支,谨慎使用 --amend,因为它会重写提交历史。
4. 提交信息规范
推荐使用 Conventional Commits 风格:
1 | |
常见类型:
| 类型 | 含义 |
|---|---|
feat |
新功能 |
fix |
Bug 修复 |
docs |
文档修改 |
style |
格式调整,不影响逻辑 |
refactor |
重构 |
perf |
性能优化 |
test |
测试相关 |
build |
构建系统或依赖 |
ci |
CI/CD 配置 |
chore |
其他维护工作 |
revert |
回滚提交 |
示例:
1 | |
好的提交应该满足:
- 一次提交只解决一个相对独立的问题;
- 提交信息说明“为什么改”和“改了什么”;
- 避免使用
update、modify、fix bug这种信息量过低的描述; - 不要把格式化、重构、新功能和 Bug 修复混在同一次提交里。
5. 文件删除、移动与重命名
5.1 删除文件
同时删除本地文件和 Git 索引:
1 | |
删除目录:
1 | |
提交删除操作:
1 | |
5.2 从 Git 索引移除,但保留本地文件
这是已经提交或已被 Git 跟踪的文件,不再希望 Git 管理时最常用的命令。
1 | |
目录:
1 | |
然后将文件加入 .gitignore:
1 | |
最后提交索引变化:
1 | |
注意:只写入 .gitignore,不能自动解除已经被 Git 跟踪文件的状态。必须先执行 git rm --cached。
5.3 根据 .gitignore 重新构建索引
当仓库中误提交了大量本应忽略的文件时,可以执行:
1 | |
这不会删除本地文件,但会重新计算哪些文件应该被 Git 跟踪。
5.4 移动或重命名文件
1 | |
移动到目录:
1 | |
Git 实际上是根据内容相似度识别重命名,因此手动执行系统的 mv 后再 git add -A,通常也能被识别。
6. .gitignore 使用指南
6.1 常见规则
1 | |
6.2 Java / Maven 项目示例
1 | |
6.3 检查文件为什么被忽略
1 | |
输出会显示是哪条规则忽略了该文件。
6.4 强制添加被忽略文件
1 | |
除非你明确知道原因,否则不要随意强制添加敏感配置、构建产物或 IDE 文件。
7. 分支操作
7.1 查看分支
查看本地分支:
1 | |
查看远程分支:
1 | |
查看全部分支:
1 | |
查看分支与上游关系:
1 | |
7.2 创建分支
1 | |
创建并切换:
1 | |
传统写法:
1 | |
推荐新项目优先使用语义更清楚的 git switch 和 git restore。
7.3 切换分支
1 | |
切换到上一个分支:
1 | |
传统写法:
1 | |
7.4 重命名分支
重命名当前分支:
1 | |
重命名指定分支:
1 | |
7.5 删除分支
安全删除已经合并的本地分支:
1 | |
强制删除未合并分支:
1 | |
删除远程分支:
1 | |
7.6 设置上游分支
首次推送新分支:
1 | |
之后可以直接:
1 | |
手动设置上游:
1 | |
8. 合并分支:merge
假设要把 feature/login 合并到 main:
1 | |
8.1 快进合并
如果 main 没有产生新的提交,Git 可以直接移动分支指针。
gitGraph
commit id: "A"
commit id: "B"
branch feature
checkout feature
commit id: "C"
commit id: "D"
checkout main
merge feature id: "Fast-forward"
8.2 创建合并提交
强制保留合并节点:
1 | |
适合希望明确保留功能分支边界的团队。
8.3 取消正在进行的合并
1 | |
9. 变基:rebase
将当前分支的提交重新应用到目标分支最新提交之后:
1 | |
gitGraph
commit id: "A"
commit id: "B"
branch feature
checkout feature
commit id: "C"
commit id: "D"
checkout main
commit id: "E"
commit id: "F"
checkout feature
commit id: "C-prime"
commit id: "D-prime"
上图是逻辑示意。实际执行 rebase 后,旧的 C、D 会被新的提交对象替代。
9.1 rebase 解决冲突
发生冲突后:
1 | |
编辑冲突文件,然后:
1 | |
跳过当前提交:
1 | |
取消整个变基:
1 | |
9.2 交互式变基
整理最近 5 个提交:
1 | |
常见操作:
| 指令 | 含义 |
|---|---|
pick |
保留提交 |
reword |
修改提交信息 |
edit |
暂停并修改提交 |
squash |
合并到前一个提交,保留信息 |
fixup |
合并到前一个提交,丢弃当前信息 |
drop |
删除提交 |
9.3 merge 和 rebase 如何选择
| 场景 | 推荐 |
|---|---|
| 公共分支、共享历史 | merge |
| 个人功能分支同步主分支 | rebase |
| 需要保留完整分支轨迹 | merge --no-ff |
| 希望提交历史线性整洁 | rebase |
| 已经推送且多人基于该分支开发 | 避免重写历史 |
核心原则:
不要随意 rebase 已经公开且被其他人使用的提交历史。
10. 远程仓库操作
10.1 查看远程仓库
1 | |
10.2 添加远程仓库
1 | |
10.3 修改远程地址
1 | |
10.4 重命名远程仓库
1 | |
10.5 删除远程仓库
1 | |
10.6 获取远程更新
只下载远程信息,不自动合并:
1 | |
获取指定远程:
1 | |
获取并清理远程已删除分支:
1 | |
全局开启自动清理:
1 | |
10.7 拉取代码
1 | |
git pull 通常相当于:
1 | |
使用变基方式拉取:
1 | |
全局设置默认使用 rebase:
1 | |
10.8 推送代码
推送当前分支:
1 | |
首次推送并建立上游:
1 | |
推送指定分支:
1 | |
推送标签:
1 | |
推送全部标签:
1 | |
11. 冲突处理
Git 冲突通常长这样:
1 | |
处理步骤:
- 打开冲突文件;
- 决定保留哪部分内容;
- 删除冲突标记;
- 测试代码;
- 将文件重新加入暂存区;
- 继续合并或变基。
合并冲突:
1 | |
变基冲突:
1 | |
查看冲突文件:
1 | |
使用当前分支版本:
1 | |
使用对方分支版本:
1 | |
注意:在 rebase 场景中,ours 和 theirs 的语义容易让人产生误解,执行前务必先检查结果。
12. 撤销操作总览
撤销操作首先要判断修改处于哪个阶段。
flowchart TD
A{修改在哪个阶段?}
A -->|仅工作区| B[git restore file]
A -->|已 add 未 commit| C[git restore --staged file]
A -->|已 commit 未 push| D[git reset]
A -->|已 push 到共享分支| E[git revert]
A -->|误删提交或 reset| F[git reflog]
12.1 撤销工作区修改
恢复单个文件到暂存区或最后一次提交的状态:
1 | |
恢复全部工作区修改:
1 | |
危险:未保存的修改会丢失。
传统写法:
1 | |
12.2 取消暂存,但保留工作区修改
1 | |
取消全部暂存:
1 | |
传统写法:
1 | |
12.3 撤销最近一次提交,但保留暂存状态
1 | |
效果:
- 提交被撤销;
- 修改仍在暂存区;
- 适合重新组织提交或修改提交信息。
12.4 撤销最近一次提交,保留工作区修改
1 | |
等价于:
1 | |
效果:
- 提交被撤销;
- 暂存状态被取消;
- 文件修改仍然保留在工作区。
这通常就是 IDE 中 Undo Commit 接近的行为。
12.5 撤销提交并丢弃所有修改
1 | |
效果:
- 删除最近一次提交;
- 丢弃暂存区修改;
- 丢弃工作区修改。
这是高风险命令,执行前建议先创建临时分支或查看 git status。
12.6 reset 三种模式对比
| 命令 | 移动 HEAD | 重置暂存区 | 重置工作区 |
|---|---|---|---|
git reset --soft |
是 | 否 | 否 |
git reset --mixed |
是 | 是 | 否 |
git reset --hard |
是 | 是 | 是 |
12.7 安全撤销已推送提交
对共享分支,推荐创建一个反向提交:
1 | |
撤销最近一次提交:
1 | |
撤销多个提交:
1 | |
只生成修改,不立即提交:
1 | |
revert 不会删除历史,而是增加一个新提交,所以更适合已经推送的公共分支。
12.8 撤销合并提交
首先查看父提交:
1 | |
通常保留第一个父提交:
1 | |
-m 1 表示以第一个父提交作为主线。不要在没理解父提交关系时盲目执行。
13. reset、restore、revert 区别
| 命令 | 主要作用 | 是否重写历史 | 典型场景 |
|---|---|---|---|
git restore |
恢复文件、取消暂存 | 否 | 撤销工作区或暂存区修改 |
git reset |
移动分支指针、重置索引和工作区 | 是 | 撤销本地未公开提交 |
git revert |
创建反向提交 | 否 | 安全撤销已推送提交 |
git checkout |
历史命令,兼顾切分支和恢复文件 | 视操作而定 | 兼容旧教程 |
git switch |
创建或切换分支 | 否 | 分支切换 |
简单记忆:
- 文件改坏了:
restore - 本地提交错了:
reset - 公共提交错了:
revert - 分支切换:
switch
14. 恢复误操作:reflog
git reflog 是 Git 的“后悔药记录器”,会记录本地 HEAD 和分支引用的移动。
1 | |
示例:
1 | |
恢复到误操作前:
1 | |
更安全的方式是先创建恢复分支:
1 | |
然后检查:
1 | |
常见可恢复场景:
reset --hard到错误提交;- 删除了本地分支;
- rebase 后找不到原提交;
- amend 后想找回旧提交;
- checkout 到错误位置后丢失引用。
reflog 主要是本地记录,不等于远程仓库的永久备份。
15. 临时保存修改:stash
当工作尚未完成,但需要切换分支时:
1 | |
带描述保存:
1 | |
包含未跟踪文件:
1 | |
包含被忽略文件:
1 | |
查看列表:
1 | |
查看某个 stash:
1 | |
恢复并保留 stash:
1 | |
恢复并删除 stash:
1 | |
恢复指定 stash:
1 | |
删除指定 stash:
1 | |
清空全部 stash:
1 | |
从 stash 创建分支:
1 | |
这在 stash 与当前代码冲突较多时非常实用。
16. 查看提交历史
16.1 基础日志
1 | |
单行显示:
1 | |
图形化显示全部分支:
1 | |
查看最近 10 条:
1 | |
查看某个文件历史:
1 | |
跟踪文件重命名前后的历史:
1 | |
查看提交包含的修改:
1 | |
查看提交统计:
1 | |
16.2 按作者、日期和内容搜索
按作者:
1 | |
按日期:
1 | |
按提交信息:
1 | |
搜索新增或删除了某段文本的提交:
1 | |
使用正则搜索 diff:
1 | |
16.3 查看某个提交
1 | |
只查看提交摘要:
1 | |
只查看某个提交中的文件:
1 | |
17. Cherry-pick:摘取提交
把其他分支的单个提交复制到当前分支:
1 | |
摘取多个连续提交:
1 | |
只应用修改,不立即提交:
1 | |
发生冲突后:
1 | |
取消操作:
1 | |
跳过当前提交:
1 | |
常见场景:
- 将某个 Bug 修复同步到发布分支;
- 从错误分支中提取一个提交;
- 将热修复同步到多个维护分支。
18. 标签:tag
18.1 查看标签
1 | |
按模式过滤:
1 | |
18.2 创建标签
轻量标签:
1 | |
附注标签:
1 | |
给指定提交打标签:
1 | |
18.3 推送标签
1 | |
推送全部标签:
1 | |
18.4 删除标签
删除本地标签:
1 | |
删除远程标签:
1 | |
推荐使用语义化版本:
1 | |
例如:
v1.0.0:首个稳定版本;v1.1.0:兼容的新功能;v1.1.1:兼容的 Bug 修复;v2.0.0:不兼容变更。
19. 比较、定位与排查
19.1 查看每一行是谁修改的
1 | |
指定行范围:
1 | |
19.2 二分查找引入 Bug 的提交
开始:
1 | |
标记当前版本有问题:
1 | |
标记一个已知正常提交:
1 | |
Git 会自动切换到中间提交。测试后继续标记:
1 | |
或:
1 | |
找到问题提交后退出:
1 | |
结合自动化测试:
1 | |
19.3 查看哪些分支包含某个提交
1 | |
查看远程分支:
1 | |
19.4 查看分支尚未合并的提交
1 | |
查看两个分支各自独有的提交:
1 | |
20. 清理未跟踪文件
预览将要删除的文件:
1 | |
删除未跟踪文件:
1 | |
删除未跟踪目录:
1 | |
同时删除被 .gitignore 忽略的文件:
1 | |
交互式清理:
1 | |
git clean -fdx 会删除构建产物、IDE 配置和本地环境文件,威力接近“项目格式化按钮”,执行前一定先用 -n 预览。
21. 强制推送与历史改写
普通强制推送:
1 | |
更安全的强制推送:
1 | |
优先使用:
1 | |
它会检查远程分支是否已经被其他人更新,可以降低误覆盖他人提交的风险。
常见需要强制推送的情况:
- 已推送的个人功能分支执行了 rebase;
- 修改了最近一次已推送提交;
- 使用交互式 rebase 整理了提交历史。
不建议对 main、master、develop 等共享分支强制推送。
22. 远程分支常见问题
22.1 远程分支已删除,本地仍然显示
1 | |
22.2 本地删除已经不存在的远程跟踪分支
1 | |
22.3 本地分支关联错了上游
查看:
1 | |
取消关联:
1 | |
重新关联:
1 | |
22.4 本地分支落后远程
1 | |
或:
1 | |
22.5 本地完全对齐远程分支
1 | |
此操作会丢弃当前分支尚未保存的本地提交和修改,执行前务必备份。
23. Worktree:同时打开多个分支
一个 Git 仓库通常一次只能检出一个分支。git worktree 可以为同一个仓库创建多个工作目录。
创建新工作目录并检出分支:
1 | |
创建新分支:
1 | |
查看 worktree:
1 | |
移除:
1 | |
清理无效记录:
1 | |
适合场景:
- 当前正在开发功能,突然需要修复线上 Bug;
- 同时运行两个版本进行对比;
- 避免频繁 stash 和切换分支。
24. Submodule:子模块
添加子模块:
1 | |
克隆包含子模块的仓库:
1 | |
初始化并更新:
1 | |
更新子模块到远程最新版本:
1 | |
子模块记录的是另一个仓库的特定提交,不是普通目录。团队协作中必须同时提交父仓库对子模块指针的变化。
25. Git LFS:管理大文件
Git 不适合直接管理频繁变化的大型二进制文件。Git LFS 会在 Git 中保存指针,在 LFS 服务中存储实际文件。
安装并初始化:
1 | |
跟踪大文件:
1 | |
提交规则:
1 | |
查看跟踪文件:
1 | |
26. 敏感文件误提交处理
26.1 只是在最近一次本地提交中
从索引移除:
1 | |
加入 .gitignore:
1 | |
修改最近提交:
1 | |
26.2 已经推送到远程
仅执行 git rm --cached 不能删除历史中的秘密。
应立即:
- 吊销并轮换泄露的密码、Token、密钥;
- 从当前版本移除敏感文件;
- 使用
git filter-repo或平台提供的历史清理方案; - 强制推送清理后的历史;
- 通知协作者重新克隆或正确同步仓库。
示例:
1 | |
然后:
1 | |
历史清理会影响所有协作者,必须协调执行。真正的第一优先级始终是轮换密钥,而不是只想着让提交“看不见”。
27. 常见场景速查
场景 1:文件修改错了,还没有 add
1 | |
场景 2:文件已经 add,想取消暂存
1 | |
场景 3:刚提交,想补一个漏掉的文件
1 | |
场景 4:刚提交,想修改提交信息
1 | |
场景 5:Undo Commit 后想让文件不再被 Git 管理
1 | |
目录:
1 | |
场景 6:撤销最近一次提交,但保留文件修改
1 | |
场景 7:撤销最近一次提交,并保持文件已暂存
1 | |
场景 8:安全撤销已经推送的提交
1 | |
场景 9:误执行了 reset
1 | |
场景 10:错误地提交到了 main
先创建正确分支保留提交:
1 | |
再让 main 回退:
1 | |
最后切换到正确分支:
1 | |
如果错误提交已经推送到共享的 main,不要直接 reset 后强推,优先使用 git revert。
场景 11:想把某个提交复制到当前分支
1 | |
场景 12:当前修改没完成,但需要切分支
1 | |
回来后:
1 | |
场景 13:本地代码不要了,完全以远程为准
1 | |
高风险操作:本地未提交和未跟踪内容可能被删除。
场景 14:删除远程分支
1 | |
场景 15:修改了已经推送的个人分支历史
1 | |
28. Git 命令速查表
仓库与配置
| 目的 | 命令 |
|---|---|
| 初始化仓库 | git init |
| 克隆仓库 | git clone <url> |
| 查看配置 | git config --list |
| 配置用户名 | git config --global user.name "Name" |
| 配置邮箱 | git config --global user.email "email" |
| 查看远程仓库 | git remote -v |
文件与暂存区
| 目的 | 命令 |
|---|---|
| 查看状态 | git status |
| 添加指定文件 | git add <file> |
| 添加全部变化 | git add -A |
| 交互式添加 | git add -p |
| 取消暂存 | git restore --staged <file> |
| 撤销工作区修改 | git restore <file> |
| 删除文件 | git rm <file> |
| 停止跟踪但保留文件 | git rm --cached <file> |
| 查看忽略规则来源 | git check-ignore -v <file> |
提交与历史
| 目的 | 命令 |
|---|---|
| 创建提交 | git commit -m "message" |
| 修改最近提交 | git commit --amend |
| 查看日志 | git log --oneline --graph --all |
| 查看提交详情 | git show <commit> |
| 查看文件每行作者 | git blame <file> |
| 查找丢失提交 | git reflog |
分支
| 目的 | 命令 |
|---|---|
| 查看分支 | git branch -a |
| 创建并切换分支 | git switch -c <branch> |
| 切换分支 | git switch <branch> |
| 删除本地分支 | git branch -d <branch> |
| 强制删除本地分支 | git branch -D <branch> |
| 删除远程分支 | git push origin --delete <branch> |
| 重命名当前分支 | git branch -m <new-name> |
合并与变基
| 目的 | 命令 |
|---|---|
| 合并分支 | git merge <branch> |
| 取消合并 | git merge --abort |
| 变基 | git rebase <branch> |
| 继续变基 | git rebase --continue |
| 取消变基 | git rebase --abort |
| 整理最近提交 | git rebase -i HEAD~N |
| 摘取提交 | git cherry-pick <commit> |
远程协作
| 目的 | 命令 |
|---|---|
| 获取远程更新 | git fetch |
| 拉取并合并 | git pull |
| 拉取并变基 | git pull --rebase |
| 首次推送分支 | git push -u origin <branch> |
| 推送当前分支 | git push |
| 安全强制推送 | git push --force-with-lease |
| 清理失效远程分支 | git fetch --prune |
撤销与恢复
| 目的 | 命令 |
|---|---|
| 撤销工作区文件 | git restore <file> |
| 取消暂存 | git restore --staged <file> |
| 撤销提交并保留暂存 | git reset --soft HEAD~1 |
| 撤销提交并保留工作区 | git reset HEAD~1 |
| 撤销提交并丢弃修改 | git reset --hard HEAD~1 |
| 安全撤销公共提交 | git revert <commit> |
| 恢复误删提交 | git reflog |
临时保存与清理
| 目的 | 命令 |
|---|---|
| 暂存当前修改 | git stash |
| 包含未跟踪文件 | git stash -u |
| 恢复并删除 stash | git stash pop |
| 查看 stash | git stash list |
| 预览清理文件 | git clean -n |
| 删除未跟踪文件 | git clean -f |
| 删除未跟踪文件与目录 | git clean -fd |
29. 推荐的团队分支流程
一个轻量且实用的流程:
gitGraph
commit id: "main-1"
branch develop
checkout develop
commit id: "develop-1"
branch feature/order
checkout feature/order
commit id: "feature-1"
commit id: "feature-2"
checkout develop
merge feature/order id: "merge-feature"
branch release/1.2.0
checkout release/1.2.0
commit id: "release-fix"
checkout main
merge release/1.2.0 tag: "v1.2.0"
checkout develop
merge main
小型团队也可以采用更简单的 GitHub Flow:
main始终保持可发布;- 每个任务创建独立功能分支;
- 开发完成后推送并创建 Pull Request;
- 代码审查和 CI 通过后合并;
- 合并后删除功能分支。
分支命名示例:
1 | |
30. Pull Request 前检查清单
提交 PR 前建议检查:
1 | |
检查项:
- 是否包含无关文件;
- 是否误提交本地配置、密码、Token;
- 是否存在调试日志或临时代码;
- 提交是否可以按逻辑拆分;
- 提交信息是否清楚;
- 是否已经通过测试;
- 是否已同步目标分支最新代码;
- PR 描述是否包含背景、改动、验证方式和风险。
31. 高风险命令清单
下面这些命令不是不能用,而是执行前必须知道会丢掉什么:
1 | |
执行高风险命令前,推荐:
1 | |
给当前状态创建一个保险分支:
1 | |
创建分支几乎不占额外空间,却可能帮你省下一场“代码考古”。
32. Git 故障排查思路
遇到问题时,不要第一反应就 reset --hard。推荐按以下顺序判断:
flowchart TD
A[Git 出现问题] --> B[执行 git status]
B --> C[确认当前分支]
C --> D[查看 git diff]
D --> E[查看 git diff --staged]
E --> F[查看 git log --oneline --graph --all]
F --> G{提交是否丢失?}
G -->|是| H[查看 git reflog]
G -->|否| I{是否正在 merge/rebase/cherry-pick?}
I -->|是| J[continue / abort]
I -->|否| K[根据工作区、暂存区、提交历史选择 restore/reset/revert]
建议优先执行这些只读命令:
1 | |
先观察,再修改。Git 很少真的把提交立刻销毁,很多事故只是“分支指针走丢了”。
参考资料
- Git 官方文档:
git help <command> - Pro Git:系统学习 Git 原理和实践的经典资料
- Git 命令帮助:
1 | |
查看简短帮助:
1 | |
遇到不熟悉的命令时,优先阅读帮助信息,不要直接复制一条看起来很勇猛的 --force 命令。
启示录
Git 的核心不是“背命令”,而是理解三个问题:
- 当前修改在哪个区域?
- 我想保留什么,丢弃什么?
- 这段历史是否已经被其他人使用?
只要先回答这三个问题,大多数 Git 操作都能正确选择:
- 工作区问题用
restore; - 暂存区问题用
restore --staged; - 本地提交问题用
reset; - 公共历史问题用
revert; - 提交找不到时用
reflog; - 想保留本地文件但停止 Git 跟踪时用
git rm --cached。
富贵岂由人,时会高志须酬。
能成功于千载者,必以近察远。