如何进行代码回退

9 阅读4分钟

开发分支需要回退某次提交

背景:开发分支会将提交合并到devtest分支,这样代码就部署到了测试环境,供测试老师进行测试。测试通过之后,会将开发分支合并到publish分支,发布上线供客户使用

如果在开发过程中发现不需要添加某个功能了,或者别的情况,对应的提交如何回退呢?

先执行

git log --oneline --graph -n 10
  1. 可以查看近10条代码的提交记录,确定自己要回退哪些提交
  2. 然后执行git revert,git revert 是 Git 中安全撤销提交的命令,核心是创建新提交抵消指定提交的修改,不删除历史提交,适合公共分支的撤销操作
  3. 基本语法
场景命令
撤销最近 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^..CA^ 是 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.连续撤销多个提交时,如果遇到冲突

  1. 手动解决冲突: 保留需要的代码,删除冲突标记;

  2. 继续撤销流程

    # 标记冲突文件为已解决
    git add .
    # 继续执行撤销(完成剩余提交的反向修改)
    git revert --continue
    
  3. 放弃撤销(可选) :若不想继续,执行:

    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:同步到远程

执行之后,本地分支是落后于远程分支的

  1. 不要执行 git pull(避免拉取远程的旧提交)

  2. 若需要同步远程,且这是私有分支,可强制推送覆盖远程(让远程也和本地保持一致):

    git push -f origin publish (填写要回滚的分支,因为我要回滚publish分支,就写了publish,按需填写分支)