开发分支需要回退某次提交
背景:开发分支会将提交合并到devtest分支,这样代码就部署到了测试环境,供测试老师进行测试。测试通过之后,会将开发分支合并到publish分支,发布上线供客户使用
如果在开发过程中发现不需要添加某个功能了,或者别的情况,对应的提交如何回退呢?
先执行
git log --oneline --graph -n 10
- 可以查看近10条代码的提交记录,确定自己要回退哪些提交
- 然后执行
git revert,git revert是 Git 中安全撤销提交的命令,核心是创建新提交抵消指定提交的修改,不删除历史提交,适合公共分支的撤销操作 - 基本语法
| 场景 | 命令 |
|---|---|
| 撤销最近 1 个提交 | git revert HEAD |
| 撤销指定提交 | git revert <commit-hash>(如 git revert a1b2c3d) |
| 撤销多个连续提交 | git revert <start-hash>..<end-hash>(左开右闭,如 git revert a1b2..d4e5 撤销 d4e5 到 a1b2 的下一个提交) |
| 只预览撤销(不提交) | git revert --no-commit <commit-hash> |
| 编辑撤销提交的说明 | git revert -e <commit-hash>(默认打开编辑器) |
关键变体语法(按需选择)
| 场景 | 命令示例 |
|---|---|
| 撤销最近 3 个连续提交 | git revert HEAD~3..HEAD(HEAD~3 是倒数第 4 个提交,HEAD 是最新提交) |
| 撤销后合并为 1 个提交(不分散) | git revert -n a9b8c7..d4e5f6(-n = --no-commit,仅应用修改不提交)然后手动提交:git commit -m "撤销B/C/D三个提交" |
| 包含起始提交的撤销 | 若要撤销 A、B、C,需用 A^..C(A^ 是 A 的父提交):git revert a9b8c7^..c3b2a1 |
| 编辑撤销提交的说明 | git revert -e a9b8c7..d4e5f6(-e = --edit,默认打开编辑器修改提交信息) |
注意点:
1.如果是要连续撤销多个提交,可以通过 git revert 最早的提交..最新的提交 实现,但是要注意,如果要撤销A B C,执行git revert A..C时,不包含A,因为左开右闭的原则。如果想要包含A,可以通过git revert A^..C, A^是A的父提交
2.连续撤销多个,如果想只产生一个revert记录,可以执行git revert -n A..C,这样还可以进行编辑,然后提交
3.连续撤销多个提交时,如果遇到冲突
-
手动解决冲突: 保留需要的代码,删除冲突标记;
-
继续撤销流程:
# 标记冲突文件为已解决 git add . # 继续执行撤销(完成剩余提交的反向修改) git revert --continue -
放弃撤销(可选) :若不想继续,执行:
git revert --abort
当开发分支执行完回退操作之后,就可以合到devtest,publish分支,将回退同步
主分支需要回滚
有时候代码合到publish之后,又发现了新的bug,或者客户不满意,就需要回滚,这个时候我们一般通过git reset(根据自己需求,看执行revert还是reset), 步骤如下
步骤 1:查看提交历史,确定基准提交
先通过日志找到 “撤销后要回到的基准提交”(即连续提交的 “起点前一个提交”): 注意:这里也是前一个提交
# 简化输出提交历史(--oneline),显示最近10个提交
git log --oneline --graph -n 10
示例输出(假设要撤销 feat2、feat3、feat4 三个连续提交,回到 feat1):
* a1b2c3d (HEAD -> dev) feat4: 优化UI # 要撤销
* b4c5d6e feat3: 新增功能3 # 要撤销
* c7d8e9f feat2: 新增功能2 # 要撤销
* d0e1f2g feat1: 初始功能 # 基准提交(撤销后要回到这里)
* f9e8d7c init: 项目初始化
步骤 2:执行 git reset 撤销连续提交
核心语法:git reset [参数] <基准提交>基准提交的两种指定方式:
- 相对位置(简单):
HEAD~N(N = 要撤销的提交数,如撤销 3 个则HEAD~3); - 具体哈希(精准):直接用基准提交的哈希(如
d0e1f2g)。
# 方式1:默认--mixed,撤销最近3个提交
git reset HEAD~3 # 等价于 git reset --mixed HEAD~3
# 方式2:用基准提交哈希
git reset d0e1f2g
步骤 3:同步到远程
执行之后,本地分支是落后于远程分支的
-
不要执行
git pull(避免拉取远程的旧提交) -
若需要同步远程,且这是私有分支,可强制推送覆盖远程(让远程也和本地保持一致):
git push -f origin publish (填写要回滚的分支,因为我要回滚publish分支,就写了publish,按需填写分支)