实践问题背景
最近在工作中遇到一个问题,我需要清除一些项目中不再被使用的代码对项目进行瘦身。我分了三个 commit 去阶段的移除代码然后合入主干打包发布上线。
当我觉得我完美的完成这个任务时😄😄,线上环境报错了因为某种原因某个模块的代码不能被删除需要打补丁补回去🥹😭,那好吧,我就干吧,一干一个不吱声。
需求其实很简单:我要回退一些代码修改,然后再 commit 推送合并主干发布上线,但是问题在于我之前修改的代码比较多而且杂乱,我不想在手动改一遍😭,有没有更好的回滚方式呢,少点手动修改,轻松上班🐶,最后我选定了使用 git revert 的方式(之前都没用过 revert 都是用的 reset,我也是问的大佬才知道的🥸🥸,大佬们见笑啦)
实践案例历程
接下来我用一个 demo 案例来展示操作:
时间线:
- 在 master 分支上切换出开发分支来开发「移除过时代码」需求:
git checkout -b 20250524_demo_remove-deprecated-code
2. 分三个 commit 分别提交修改内容(左边是修改前代码内容,右边是修改后代码内容):
- commit 1
- commit 2
- commit 3
这里的每个 commit 的修改内容都是只增加了一行注释,方便大家理解。
- 接下来就是把三个 commit 合并为一个 commit 然后合并入 master 分支中。
# 将 commit1、commit2、commit3 修改合并并合入 master,放在暂存区,但是不提交。
git checkout master
git merge --squash 20250524_demo_remove-deprecated-code
# 提交 master 分支上的修改,自定义有含义的 commit message
git commit -m 'remove deprecated code'
# 跟着你 git push 推到线上仓库就可以上线了
git push
-
上线发现问题,问题定位到的 commit2 修改需要回滚,commit2 的修改如下:
回滚 commit2 也就是我们要把增加的
// commit 2 的修改注释文本去掉。 -
首先在 master 上创建新分支开发「修复移除过时代码需求」
git checkout -b 20250524_demo_fix-remove-deprecated-code
- 在 20250524_demo_fix-remove-deprecated-code 分支上使用 git revert 回滚 commit2 内容。
git revert 6408f3c2c521db25bb44010a6a6eb6113b2ef237
这里指定的是 commit2 的 commit id,你可以通过 git log 20250524_demo_remove-deprecated-code 指定之前的分支查看,需要回滚那个 commit 就找到他的 commit id 然后执行即可。(如果有冲突就手动解决一下冲突再执行 git revert --continue 即可)
这样我们的 20250524_demo_fix-remove-deprecated-code 分支上就有了 revert 的 commit 了。
其中的 revert commit 的 commit message 也很详细:
Revert "commit 2"
This reverts commit 6408f3c2c521db25bb44010a6a6eb6113b2ef237.
最后再 git merge 到 master 分支上再,git push 即可上线。
拓展
在使用 git revert 命令时,你可以增加 -n 或 --no-edit 参数,这也是我经常会用到的。
-n(--no-commit)
git revert 命令模式是创建包含回滚 commit 内容的 commit 提交,我们可以不让他不创建提交,只是是回滚的 commit 内容放在暂存区,我们自己来手动提交,这就给了我们回滚 commit 内容后,再在 commit 内容的基础上再做一些修改再提交的可能性,非常方便。
git revert -n 6408f3c2c521db25bb44010a6a6eb6113b2ef237
--no-edit
git revert 命令模式是创建包含回滚 commit 内容的 commit 提交时,指定该参数可以让 git 直接使用默认的 commit message 直接自动提交,不需要再弹出编辑器再让我们自行修改 commit message 信息了(很多时候我都不需要改,每次都弹出来的话太麻烦了)。
参考
- git-scm.com/docs/git-re… 强烈推荐这个 git 官方的文档,支持中文文档,非常友好且内容清晰,文档的最后还有使用案例参考。