• Git进阶命令-revert


    有关Git,之前有写过两篇文章:

    一、revert命令使用场景

    有一天项目经理跟你说,你开发上线的代码有问题,需要马上撤回。

    撤回?你第一反应那不就是 reset一下嘛。

    正当你满心欢喜,想找到需要reset 的commitId时,你惊喜的发现,master分支上已经有其他同同事提交的代码了。

    怎么办?用reset的话 会把同事这部分代码也撤回了。

    但此时情况又十分紧急,你绞尽脑汁也没有想到好的办法。只能任性的使用 reset。

    然后低头哈腰的让同事把他们代码重新合一遍,从此你在你同事眼里就打上了菜鸡的标签。


    二、reset 和 revert 区别

    reset命令是重置到一个记录:git reset是将之前的提交记录全部抹去,将 HEAD 指向自己重置的提交记录;

    revert命令是撤回一个记录;git revert 操作是撤回某一次提交记录,若之后又有提交,提交记录还存在。


    三、示例演示

    我们通过示例来更好的理解 revert 命令

    上面是最近的5次提交记录,这时第3提交有错误,需要撤回这次提交。

    执行命令

    git revert  6274264
    

    因为 revert 会生成一条新的提交记录,这时会让你编辑提交信息,编辑完后 :wq 保存退出就好了。

    保存之后,我们再来看当前提交的记录

    通过提交历史日志我们可以发现 虽然是撤回提交3,但之前4和5的提交记录都还在,这点和reset 不一样。

    说明 git revert 可以保留完整的 git 历史,对多人合作的分支来说比较友好。

    同时我们也看下 1ccafe6 这次到底提交了什么内容

    查看命令

    git show 1ccafe6
    

    我们可以看出,这次revert 仅仅撤回 第 3 次提交的内容。它采用逆向操作。如果之前有创建文件->删除文件,新增代码->删除代码,删除代码->新增代码等。

    通过这样一种方式,来撤回具体某一次的操作。

    git revert 是反做撤销其中的commit-id,然后重新生成一个commit-id。本身不会对其他任何的提交commit-id产生影响


    四、revert 合并提交有坑

    在 git 的 commit 记录里,还有一种类型是合并提交,想要 revert 合并提交,使用上会有些不一样。

    现在 发现 3b5ad0c 合并分支提交有误,需要撤回。

    1、坑一

    我们用上面同样的命令

    $ git revert  3b5ad0c
    error: commit 3b5ad0cfcad49f7d2caa65449a8adf713da0accd is a merge but no -m option was given.
    fatal: revert failed
    

    使用刚刚同样的 revert 命令,会发现命令行报错了。

    为什么会这样?

    因为merge操作有2个分支,而revert不知道要还原哪个分支的提交。需要使用-m 1参数来告诉revert命令哪个是主线。

    选择主线就还原非主线,选择非主线就还原主线。

    修改命令

    git revert -m 1 3b5ad0c
    

    可以发现revert撤销成功了。

    2、坑二

    在上面的场景中,虽然撤销了master合并到feature这一次提交。

    但如果你在切到master,再将修改后的代码提交。再次合并到feature分支时,会发现之前被 revert 的修改内容没有重新合并进来。

    那是因为你在feature 虽然使用了 revert 命令。但当前分支还是会保留之前合并的记录,git 判断有相同的 commitHash,就忽略了相关 commit 修改的内容。

    这时就需要 revert 掉之前 revert 的合并提交。

    具体命令

    - 83c20e0是之前撤销合并请求的commitId
    git revert  83c20e0
    

    这样之后,之前 通过revert 撤回的代码才不会丢失。

    对于 revert 撤回 Merge 提交,你必须重新把Revert的再Revert回去,不然Git会认为你不需要这些内容。也就是说,下一次Merge的时候,会丢失代码!


    五、git revert 选项

    git revert  -e / --edit  commit-id
    

    这是默认的选项,你不需要单独配置它,有了这个配置,在执行 git revert 后,会弹出默认编辑器来让你对该次变更的信息进行修改。

    git revert  --no-edit  commit-id
    

    与 -e / --edit 相反,传入这个选项那么就不会弹出默认编辑器来让你修改变更信息。

    git revert  -n / --no-commit  commit-id
    

    传入这个选项意味着 git revert 执行后并不会自动产生commit,而是把改动的代码加到工作区和暂存区,用户可以自行修改并提交commit。

    总的来讲 git revert其实算是一个进度往前走的逆向提交,也就是说HEAD版本及提交记录将会继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。



    **声明**: 公众号如需转载该篇文章,发表文章的头部一定要 告知是转至公众号: 后端元宇宙。同时也可以问本人要markdown原稿和原图片。其它情况一律禁止转载!
  • 相关阅读:
    为什么我建议在复杂但是性能关键的表上所有查询都加上 force index
    加密 K8s Secrets 的几种方案
    Thrift/RPC学习分享
    半小时制作简单版澳大利亚导游地图,太简单了,你也可以
    elasticsearch通用工具类
    使用HBuilderX将H5网页打包成APP
    ThreadLocal
    【软件开发面经】大厂面试经验
    洛谷P5724 【深基4.习5】求极差 / 最大跨度值
    【LabVIEW 】串口如何读取长度不一致的字符串
  • 原文地址:https://www.cnblogs.com/qdhxhz/p/17947598