git - 简述三种'代码回滚'方式

3,618 阅读6分钟

日常开发关于git回滚小技巧

前言

前端开发中难免遇到某版本bug修复,产品要求版本回滚等问题.下面带大家看一下针对以下应用场景有哪些不错的回滚方式.

贴出官方文档以便大家进一步学习 Git

git revert:

  • git-rever -撤销某次操作,此操作不会修改原本的提交记录,而是会新增一条提交记录来抵消某次操作

应用背景

  • 你的项目最近有3个功能上线,且开发代码目前都在dev分支上(在不考虑开发功能分支的情况下),此时产品同学说,因业务转变要取消功需求a,不进行发布,此时dev分支有三个提交记录,分别是需求a,b,c的提交记录,你会如何处理.

image.png

image.png

实践

  • 我们现在来取消功能a的提交,并且保证b,c需求不会丢失.

     git revert commitHASH  //撤销某次操作,此操作不会修改原本的提交记录,而是会新增一条提交记录来抵消某次操作。

image.png

结果

  • 保留现有工作区内容,暂存区(在使用vevert时,暂存区内容存在可提交项,是无法回滚的),可以利用该命令保留工作区机制,先用"git restore --staged ."(撤销暂存区存储,回退至工作区),来存储已经add的代码
  • 过程中如果遇到问题(如处理冲突时搞乱了),可用 "git revert --abort" 取消本次回滚行为。
  • 历史提交记录不会被删除掉
  • 完美撤回历史提交,并产生一条新的提交记录
  • 在保留代码提交记录不丢失,且要求需求b,c代码留存的情况下,使用git revert 高效实现了此次产品上线要求

git reset --hard:

  • git reset --hard commitHASH -将分支回退到指定分支,暂存区和工作区都会被同步为该指定的提交

应用背景

  • 你的项目最近有3个功能上线,且开发代码目前都在dev分支上(在不考虑开发功能分支的情况下),此时产品同学说,因业务转变要取消需求b,c,不进行发布,此时dev分支有三个提交记录,分别是需求a,b,c的提交记录,你会如何处理.

image.png 实践

  • 我们现在来取消功能b,c的提交,并且保证a需求不会丢失.
     git reset --hard commitHASH  //将分支回退到指定分支,暂存区和工作区都会被同步为该指定的提交

image.png

结果

  • 当前工作区,暂存区被清空
  • 查看历史提交记录git log --oneline 发现功能a之后的提交记录被清除
  • 成功回退到了产品要求的可提交版本
  • 因为导致b,c的功能提交记录被删除,在不考虑依赖git reflog 的情况下,如果此时业务与产品沟通,又需要b,c的功能代码会是一个隐患

git checkout :

  • git checkout commitHASH -b <new_branch> 在指定的提交对象上创建新的分支

应用背景

  • 你的项目最近有3个功能上线,且开发代码目前都在dev分支上(在不考虑开发功能分支的情况下),此时产品同学说,因业务转变要暂时取消需求b,c,不进行发布,此时dev分支有三个提交记录,分别是需求a,b,c的提交记录,且产品决定下次发布的时候,一起带上b,c功能,你会如何处理

image.png

实践

  • 我们现在来取消功能b,C的提交
  • 保留并发布a功能
  • 保证b,c功能的代码提交记录不会丢失
     git checkout commitHASH -b <new_branch>  //copy一个指定分支的提交记录并创建一个新的分支

WechatIMG55的副本.png 结果

  • 当前工作区,暂存区代码被保留,会跟着来到新分支
  • 为指定功能提交的代码,开启了一个新的分支,在新分支提交记录中,没有保留功能b,c的代码
  • 保留了原分支代码提交记录,产品如果需要a功能,用新分支进行发布即可,用一种巧妙的方式完成了产品的需求
  • 如果后续业务需要使用b,c功能,可切换至之前的代码分支,进行发布即可。

git reflog(杀手锏) :

  • git reflog 杀手锏,保留本地操作所有分支的提交记录,有一定时间限制(默认 90 天),超时的会被自动清理。另外如果主动执行清理命令也会提前清理掉

应用背景

  • 此时我们回到场景2,会发现因为执行了git hard 命令的原因,导致查看提交记录时,无法找b,c功能,如果此时产品需要b,c功能我们应该怎么处理呢

实践

  • 此时git log --oneline 已查找不到b,c功能的提交记录,我们敲入 git reflog会发现本地操作提交过的代码记录都映入眼帘
  • 我们在配合git checkout commitHASH -b <new_branch> 命令切换到功能c的代码被本即可满足产品需求.

601637956091_.pic_hd.jpg

结果

  • 可查看被删除的提交记录
  • 可根据 git reflog + git checkout ... 恢复本地误删的分支及提交记录
  • 尽量做好git安全性操作,不要过度依赖使用git reflog

总结:

命令特点应用
git revert commit保留工作区、保留历史提交记录、安全性高可用于撤销产品暂时不想要的功能,并且想要保留之后的提交的功能、生产环境中因新增内容产生严重bug时,也可以用此功能来进行稳定回滚
git reset --hard commit清空工作、暂存区、删除历史提交记、稳定性低可用于删除掉一些低效提交的代码,净化提交记录、因为会清空提交记录,这里不太建议使用(最好不要过度依赖reflog
git checkout coomit -b <new_branch>保留工作区、暂存区、保留历史提交记录、安摘取功能点、新分支、新分支中无污染(只保留摘取功能点之前的提交记录)、安全性高可以用于摘取功能点,如产品说要上新需求时,单独上某一个需求,但是当前分支已经提交了很多功能点,此时我们就可以用该命令单独拎出产品需要的功能进行单独发布

本文讲述了三种不同场景该如何巧妙使用git,以及误删提交代码、分支时该如何处理,希望大家看完本文能帮助到大家,建议在工作日常多多使用一些高效的命令,增加代码产出的同时,也要把控好分支管理,避免查看 git 提交记录时发现无从下手hhh~

参考文献