Git如何优雅地回退代码
扫描二维码
随时随地手机看文章
来源:cnblogs.com/zhenbianshu/p/12018714.html
前言
基础试探
revert
git revert commit_id
能产生一个 与 commit_id 完全相反的提交,即 commit_id 里是添加, revert 提交里就是删除。
mainline
Reset
reset
了, reset 也能使代码回到某次提交,但跟 revert 不同的是, reset 是将提交的 HEAD 指针指到某次提交,之后的提交记录会消失,就像从没有过这么一次提交。
--hard
选项完全抛弃这些旧代码,reset 后再强制推到远端。
master> git reset --hard commit_id
master> git push --force origin master
reflog
恢复,但也是一番折腾。
升级融合
rebase
rebase
把多个提交合并成一个提交,再使用 revert 产生一次反提交,这种方法的思路非常清晰,把 revert 和 rebase 两个命令搭配得很好,相当于使用 revert 回退的升级版。
-
首先,切出一个新分支 F,使用 git log 查询一下 要回退到
的 commit 版本 N。 -
使用命令 git rebase -i N
, -i 指定交互模式后,会打开 git rebase 编辑界面,形如:pick 6fa5869 commit1
pick 0b84ee7 commit2
pick 986c6c8 commit3
pick 91a0dcc commit4 这些 commit 自旧到新由上而下排列,我们只需要在 commit_id 前添加操作命令即可。
在合并 commit 这个需求里,我们可以选择
pick(p)
最旧的 commit1,然后在后续的 commit_id 前添加squash(s)
命令,将这些 commits 都合并到最旧的 commit1 上。-
保存 rebase 结果后,再编辑 commit 信息,使这次 rebase 失效,git 会将之前的这些 commit 都删除,并将其更改合并为一个新的 commit5 如果出错了,也可以使用
git rebase --abort/--continue/--edit-todo
-
这个时候,主分支上的提交记录是 older, commit1, commit2, commit3, commit4
而 F 分支上的提交记录是 older, commit5
,由于 F 分支的祖先节点是 older,明显落后于主分支的 commit4,将 F 分支向主分支合并是不允许的所以我们需要执行
git merge master
将主分支向 F 分支合并,合并后 git 会发现 commit1 到 commit4 提交的内容和 F 分支上 commit5 的修改内容是完全相同的,会自动进行合并,内容不变,但多了一个 commit5。 再在 F 分支上对 commit5 进行一次 revert 反提交,就实现了把 commit1 到 commit4 的提交全部回退。
文件操作
从主分支上切出一个跟主分支完全相同的分支 F。
从文件管理系统复制项目文件夹为 bak,在 bak 内使用
git checkout N
将代码切到想要的历史提交,这时候 git 会将 bak 内的文件恢复到 N 状态。在从文件管理系统内,将 bak 文件夹下
除了 .git
文件夹下的所有内容复制粘贴到原项目目录下。git 会纯从文件级别识别到变更,然后更新工作区。在原项目目录下执行
add 和 commit
,完成反提交。
小结
revert 适合需要回退的历史提交不多,且无合并冲突的情景。
如果你可以向 master 强推代码,且想让 git log 里不再出现被回退代码的痕迹,可以使用
git reset --hard + git push --force
如果你有些 geek,追求用”正规而正统”的方式来回退代码,rebase + revert 满足你的需求。
如果你不在乎是否优雅,想用最简单,最直接的方式,文件操作正合适。
-END-
推荐阅读
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!