日常开发关于git回滚小技巧
前言
前端开发中难免遇到某版本bug修复,产品要求版本回滚等问题.下面带大家看一下针对以下应用场景有哪些不错的回滚方式.
贴出官方文档以便大家进一步学习 Git
git revert:
git-rever
-撤销某次操作,此操作不会修改原本的提交记录,而是会新增一条提交记录来抵消某次操作
应用背景
- 你的项目最近有3个功能上线,且开发代码目前都在dev分支上(在不考虑开发功能分支的情况下),此时产品同学说,因业务转变要取消功需求a,不进行发布,此时dev分支有三个提交记录,分别是需求a,b,c的提交记录,你会如何处理.
实践
-
我们现在来取消功能a的提交,并且保证b,c需求不会丢失.
git revert commitHASH //撤销某次操作,此操作不会修改原本的提交记录,而是会新增一条提交记录来抵消某次操作。
结果
- 保留现有工作区内容,暂存区(在使用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的提交记录,你会如何处理.
实践
- 我们现在来取消功能b,c的提交,并且保证a需求不会丢失.
git reset --hard commitHASH //将分支回退到指定分支,暂存区和工作区都会被同步为该指定的提交
结果
- 当前工作区,暂存区被清空
- 查看历史提交记录
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功能,你会如何处理
实践
- 我们现在来取消功能b,C的提交
- 保留并发布a功能
- 保证b,c功能的代码提交记录不会丢失
git checkout commitHASH -b <new_branch> //copy一个指定分支的提交记录并创建一个新的分支
结果
- 当前工作区,暂存区代码被保留,会跟着来到新分支
- 为指定功能提交的代码,开启了一个新的分支,在新分支提交记录中,没有保留功能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的代码被本即可满足产品需求.
结果
- 可查看被删除的提交记录
- 可根据
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~