这其实是个非常简单的指令,甚至用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就好了~