Git 使用与回滚:提交规范与撤销方法
1068 字
5 分钟
Git 使用与回滚:提交规范与撤销方法
提交规范
提交节奏:小步快跑
- 一次提交只做一件事:一个功能 / 一个修复 / 一次文档更新
- 提交的必须是完整可用状态(能编译、不破坏)
- 别攒一大堆改动一次性提交——难 review、难回滚
提交信息:type: 描述
| type | 用途 | 例子 |
|---|---|---|
init | 初始化 | init: 博客项目骨架 |
feat | 新功能 | feat: 发表文章功能 |
fix | 修 bug | fix: id 重复分配 |
docs | 文档 | docs: 更新 README |
chore | 杂务(gitignore/构建) | chore: 忽略 reference 目录 |
refactor | 重构不改功能 | refactor: 抽取 ScannerUtil |
同一改动别拆成两条相同消息的 commit——历史里一眼难分辨。
提交前必查
git status # 看有哪些改动git diff # 看未暂存的具体改动git diff --cached # 看已暂存的具体改动git log --oneline -3 # 确认 HEAD 在哪、要提交的上一笔是什么分支习惯
- master 永远保持可用,别在上面乱试
- 开新东西就开分支:
git checkout -b feat/xxx - 练习/试错也在分支上做,完事删分支,主分支不脏
绝不提交的内容
- 敏感信息(密码/token/密钥)——误提交了要清理历史并更换凭据,光删文件不够
- 生成物(编译输出、node_modules)——靠
.gitignore挡住
回滚方法论:先确认处在哪一步
核心:回滚范围从小到大,命令选择取决于当前处于哪一步。
| 当前状态 | 命令 | 效果 |
|---|---|---|
| 改了文件,还没 add | git restore <file> | 丢弃改动,回到上次提交 |
| add 了,还没 commit | git restore --staged <file> | 撤出暂存区(改动保留在工作区) |
| 提交了,还没 push | git reset --soft HEAD~1 | 撤销提交,改动回暂存区 |
| 同上,想连暂存一起撤 | git reset HEAD~1(默认 —mixed) | 撤销提交,改动回工作区 |
| 同上,改动彻底不要 | git reset --hard HEAD~1 | ⚠️ 撤销提交且丢弃改动(危险) |
| 已经 push / 想保留历史 | git revert <commit> | 生成一个反向提交,历史不变 |
| 改最近一次提交 | git commit --amend | 改写最近一次提交的信息/内容 |
两条铁律
reset是改写历史,只在还没 push(无人共享)时使用;push 过的回滚必须用revert(不动历史,补反向提交)reset --hard用前想三遍——工作区改动会被一起删掉;后悔了靠git reflog找回
reflog:本地时间机器
git reflog # 看每一次 HEAD 移动(含被 reset 掉的提交)git reset --hard <sha> # 跳回任何历史位置被 reset --hard 杀掉的提交在 git log 里没了,但 reflog 里全留着。本地后悔靠 reflog,远程后悔靠 revert。
口诀
工作区用
restore,暂存区用restore --staged,本地提交用reset,远程提交用revert,后悔了找reflog,删分支小写-d(已合并才删)、确认后大写-D(强删)。
常见踩坑
- PowerShell 的
echo >>破坏编码:echo "..." >> file会用 UTF-16 写文件,把 UTF-8 源文件变成 git 眼里的「二进制文件」(git diff不显示文本差异)。追加源码内容改用编辑器,或Add-Content -Encoding UTF8 git diff为空不代表没有改动:默认只看未暂存改动;已 add 的内容要git diff --cached才看得到- “nothing to commit” 时别硬 commit 或 revert:先
git status/git log确认 HEAD 和真实状态,跳过这一步容易出现 revert 乌龙 - revert 的 revert 会生成 Reapply:撤销一个本身就是 Revert 的提交,git 会生成
Reapply(重新应用原改动)提交,真实项目里常见 git branch -d有安全保护:未合并的分支会拒绝删除并给出提示;确认分支内容确实不要了,才用-D强制删除
命令速查
git status # 当前状态git add <file> # 暂存git commit -m "type: 描述" # 提交git log --oneline # 提交历史(一行一条)git diff # 未暂存改动git diff --cached # 已暂存改动git restore <file> # 丢弃工作区改动git restore --staged <file> # 撤出暂存区git reset --soft/mixed/hard HEAD~1 # 撤销最近提交(三档)git revert HEAD --no-edit # 反向提交撤销(保留历史)git reflog # HEAD 移动历史(后悔药)git checkout -b <分支> # 新建并切换分支git checkout master # 切回主分支git branch -d / -D <分支> # 删分支(安全 / 强制)支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
Git 使用与回滚:提交规范与撤销方法
https://ryuki.icu/posts/git-usage-and-rollback/相关文章智能推荐
1
Docker Desktop 卡在 Starting the Docker Engine 与后台 500:E_ACCESSDENIED 完整排查笔记
工具Docker Desktop 无限卡在启动、后台 API 报 500,根因是缓存搬移工具把 docker_data.vhdx 属主变成了 Administrators,WSL2 AttachDisk 对调用用户授权校验失败返回 E_ACCESSDENIED——完整证据链与修复步骤。
2
ArrayList、线程池与 JVM:一次 Java 底层复盘
JavaArrayList 懒加载与 1.5 倍扩容、asList 与 toArray 的镜像坑、线程池核心线程数怎么定、JVM 运行时数据区、双亲委派、垃圾判定与三大回收算法,以及调优参数和排查工具速查。
3
为了我的千兆网,打水晶头,装模块、买了测线仪,最后还是输给了墙中线
折腾笔记家里电脑常年百兆,千兆套餐形同虚设。直连光猫确认千兆、拆面板发现模块只压了四根线、按色标重排线序、怒买测线仪抓到断线重打——每一步都以为破案了,每一步插回去都是百兆。一场从入门到放弃的排障实录。
4
每日一记(8/28):LLM 智能体运行原理与 AI 三大范式
AILLM 智能体的三种形态(反应式/规划式/混合式)、符号主义与亚符号主义之争及神经符号主义的和解,再到「感知—思考—行动」循环的运行机制。
5
每日一记(8/28):Nacos、OpenFeign 与网关构建微服务调用链
JavaNacos 服务发现接入四步、手写负载均衡与 OpenFeign 声明式调用两条路线、HTTP 连接池复用,以及 Spring Cloud Gateway 的路由转发与 GlobalFilter 登录校验。
随机文章随机推荐





















