视频加载失败

Git 使用与回滚:提交规范与撤销方法

1068 字
5 分钟
Git 使用与回滚:提交规范与撤销方法

提交规范#

提交节奏:小步快跑#

  • 一次提交只做一件事:一个功能 / 一个修复 / 一次文档更新
  • 提交的必须是完整可用状态(能编译、不破坏)
  • 别攒一大堆改动一次性提交——难 review、难回滚

提交信息:type: 描述#

type用途例子
init初始化init: 博客项目骨架
feat新功能feat: 发表文章功能
fix修 bugfix: id 重复分配
docs文档docs: 更新 README
chore杂务(gitignore/构建)chore: 忽略 reference 目录
refactor重构不改功能refactor: 抽取 ScannerUtil

同一改动别拆成两条相同消息的 commit——历史里一眼难分辨。

提交前必查#

Terminal window
git status # 看有哪些改动
git diff # 看未暂存的具体改动
git diff --cached # 看已暂存的具体改动
git log --oneline -3 # 确认 HEAD 在哪、要提交的上一笔是什么

分支习惯#

  • master 永远保持可用,别在上面乱试
  • 开新东西就开分支:git checkout -b feat/xxx
  • 练习/试错也在分支上做,完事删分支,主分支不脏

绝不提交的内容#

  • 敏感信息(密码/token/密钥)——误提交了要清理历史并更换凭据,光删文件不够
  • 生成物(编译输出、node_modules)——靠 .gitignore 挡住

回滚方法论:先确认处在哪一步#

核心:回滚范围从小到大,命令选择取决于当前处于哪一步。

当前状态命令效果
改了文件,还没 addgit restore <file>丢弃改动,回到上次提交
add 了,还没 commitgit restore --staged <file>撤出暂存区(改动保留在工作区)
提交了,还没 pushgit reset --soft HEAD~1撤销提交,改动回暂存区
同上,想连暂存一起撤git reset HEAD~1(默认 —mixed)撤销提交,改动回工作区
同上,改动彻底不要git reset --hard HEAD~1⚠️ 撤销提交且丢弃改动(危险)
已经 push / 想保留历史git revert <commit>生成一个反向提交,历史不变
改最近一次提交git commit --amend改写最近一次提交的信息/内容

两条铁律#

  1. reset 是改写历史,只在还没 push(无人共享)时使用;push 过的回滚必须用 revert(不动历史,补反向提交)
  2. reset --hard 用前想三遍——工作区改动会被一起删掉;后悔了靠 git reflog 找回

reflog:本地时间机器#

Terminal window
git reflog # 看每一次 HEAD 移动(含被 reset 掉的提交)
git reset --hard <sha> # 跳回任何历史位置

被 reset --hard 杀掉的提交在 git log 里没了,但 reflog 里全留着。本地后悔靠 reflog,远程后悔靠 revert。

口诀#

工作区用 restore,暂存区用 restore --staged,本地提交用 reset,远程提交用 revert,后悔了找 reflog,删分支小写 -d(已合并才删)、确认后大写 -D(强删)。

常见踩坑#

  1. PowerShell 的 echo >> 破坏编码:echo "..." >> file 会用 UTF-16 写文件,把 UTF-8 源文件变成 git 眼里的「二进制文件」(git diff 不显示文本差异)。追加源码内容改用编辑器,或 Add-Content -Encoding UTF8
  2. git diff 为空不代表没有改动:默认只看未暂存改动;已 add 的内容要 git diff --cached 才看得到
  3. “nothing to commit” 时别硬 commit 或 revert:先 git status / git log 确认 HEAD 和真实状态,跳过这一步容易出现 revert 乌龙
  4. revert 的 revert 会生成 Reapply:撤销一个本身就是 Revert 的提交,git 会生成 Reapply(重新应用原改动)提交,真实项目里常见
  5. git branch -d 有安全保护:未合并的分支会拒绝删除并给出提示;确认分支内容确实不要了,才用 -D 强制删除

命令速查#

Terminal window
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/
作者
RK
发布于
2026-08-03
许可协议
CC BY-NC-SA 4.0
相关文章智能推荐
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 登录校验。
随机文章随机推荐

评论区

Profile Image of the Author
RK
Long may the sunshine
公告
Long may the sunshine
分类
标签
最新动态
站点天气
天气加载中…
站点统计
文章
27
分类
6
标签
59
总字数
39,139
篝火已燃
0 天
最后活动
0 天前
每日一签