zoukankan      html  css  js  c++  java
  • Git revert -m

    这其实是个非常简单的指令,甚至用AS,直接右键操作不需要两秒钟
    但今天使用命令行的方式操作的时候居然发现了点不一样的地方:
    如下我希望revert某个commit,找到了它的id,跑一下命令之后居然发现报错了,如下

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

    然后看了下help发现,你需要用 -m 指定1或是2:git revert [id] -m [1|2]
    为什么呢,不是直接反向执行下这个commit进行的修改吗,commit加一行revert就减一行吗?为什么还要选1还是2模式

    这正好就触及到你对git实现原理的本质理解了,git并不是基于diff进行管理的(有这样的版本管理系统),git的每个commit都是一个当前版本的快照,简单说每个commit都是一个完整的仓库版本,所以当你需要revert某个commit的时候,GIT需要知道你到底是希望revert哪个commit与这个commit间的改动

    不过其实并没有那么复杂,你要revert一个commit,就是revert掉这个commit和它上个commit间的改动,所以大部分时候,你直接revert就好了,不用指定-m参数

    不过当你要revert的的commit的上面有两个commit节点的时候,问题就来了

    A -> B -> 
                E -> F
    C -> D ->
    

    比如这里的E节点,它是AC两个分支合并的节点,这里假设是你在A分支使用命令merge C,那么E就有两个上游节点了,当你在新的分支F(其实就是之前的A分支)revert E 时,你就需要加上-m参数了,当你指定1时,就是revert 掉 B到E的改动,当你指定2时,你也可以revert 掉 D到E的改动,其实大部分时候我们都是选1就好了~

  • 相关阅读:
    DS博客作业06——图
    DS博客作业05——树
    DS博客作业03——栈和队列
    DS博客作业02--线性表
    DS博客作业01--日期抽象数据类型设计与实验
    C语言课设——电影院选票系统
    C语言博客作业06——结构体&文件
    C语言博客作业05——指针
    DS博客作业08--课程总结
    DS博客作业07--查找
  • 原文地址:https://www.cnblogs.com/bellkosmos/p/11409904.html
Copyright © 2011-2022 走看看