分享

git revert用法

 流水1314 2022-08-12 发布于广东

场景

在 Git 开发中通常会控制主干分支的质量,但有时还是会把错误的代码合入到远程主干。
虽然可以直接回滚远程分支, 但有时新的代码也已经合入,直接回滚后最近的提交都要重新操作。
那么有没有只移除某些 Commit 的方式呢?
可以一次 revert操作来完成。

revert可以回滚指定的提交

语法

git revert bb91a99836a4e291e960ec18d89329d8a65b4d52 # 撤销指定提交,直接产生一个新的commit,工作区中清除对应commit-id的代码  git revert --no-commit bb91a99836a4e291e960ec18d89329d8a65b4d52# 撤销指定提交,工作区中清除对应commit-id的代码,但是需要`git add && git commit `的手动提交  git revert --no-commit f7742cd..551c408# 撤销指定一串提交,不包括第一个提交f7742cd,但是包括最后一个提交551c408  

样例

考虑这个例子,我们提交了 6 个版本,其中 3-4 包含了错误的代码需要被回滚掉。 同时希望不影响到后续的 5-6。

* 982d4f6 (HEAD -> master) version 6* 54cc9dc version 5* 551c408 version 4, harttle screwed it up again* 7e345c9 version 3, harttle screwed it up* f7742cd version 2* 6c4db3f version 1

可能是流程或认为原因不小心合入了错误的代码, 也可能是合入一段时间后才发现存在问题。
总之已经存在后续提交,使得直接回滚不太现实。

下面就开始介绍具体操作了,同时我们假设远程分支是受保护的(不允许 Force Push)。

思路是重新产生一个新的 Commit 撤销之前的错误提交。

使用git revert <commit>可以撤销指定的提交, 要撤销一串提交可以用 <commit1>..<commit2> 语法。

注意这是一个前开后闭区间,即不包括 commit1,但包括 commit2。

git revert --no-commit f7742cd..551c408git commit -a -m 'This reverts commit 7e345c9 and 551c408'

其中 f7742cd 是 version 2,551c408 是 version 4,这样被移除的是 version 3 和 version 4。
注意 revert 命令会对每个撤销的 commit 进行一次提交,--no-commit 后可以最后一起手动提交。

此时 Git 记录是这样的:

* 8fef80a (HEAD -> master) This reverts commit 7e345c9 and 551c408* 982d4f6 version 6* 54cc9dc version 5* 551c408 version 4, harttle screwed it up again* 7e345c9 version 3, harttle screwed it up* f7742cd version 2* 6c4db3f version 1

现在的 HEAD(8fef80a)就是我们想要的版本,把它 Push 到远程即可。

注意:

git revert commit-id

是撤销指定提交,和前开后闭的连串撤销不同

注意

git revert 之后,再提交merge request,会丢失代码,因为revert 多了一次提交记录
这次提交的记录就是删除多余代码

比如,git 合并了 feature-xxx => master,然后发现合错分支了,用了revert
然后再合并 feature-xxx => develop => test2 => master 过程中,会丢失revert部分代码
因为多了一个revert的commit

这种场景,不希望合丢代码,尽量用reset

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多