git revert版本回退的一点插曲

之前在学习Git的时候,是看廖雪峰大神的教程来着。

然后在做作业的时候,要用到版本回退,这时候灵机一动,想到廖神教程中有教git reset --hard commit_id

这个命令有个前提,你没有把本地仓库推送到远程。然而我没有注意到这一点,于是GG,因为远程库分支受保护,不允许强行回退。

然后啊然后,导师就说一般在实际合作中是不能用git reset 命令的,会造成很多不可描述的严重后果。一般都是用git revert 命令来进行版本回退的。

git revert 这个命令很陌生,网上虽然有很多介绍,但基本都是复制粘贴的,一旦某点有困惑,就要花很多时间找答案。(官方文档在这)

一开始我以为这个命令和reset一样,都是指定commit_id之后就会回滚到该id的内容,只不过是HEAD并没有往后走,而是又重新生成了一个提交

但在实践的过程中发现不对,git revert commit_id之后并不会回滚到该id的内容,而是将该id的内容给逆向操作一遍,比如说,a操作添加了“haha”,commit了a,b操作添加了“xixi”,commit b。现在想回滚到只添加了“haha”,需要的是删除“xixi”,也就是逆向操作b,所以应该git revert b的commit_id

到这里应该就清楚了,git revert 应该翻译成“反转、逆转”比较好理解,而不是回退。


另外,当你要反向操作的一个merge操作的时候,你需要指定反向到哪个分支,因为GIt并不知道merge之前是谁。

通过git log 查看merge的两个分支:

commit 9d55438d68abcfd8e198 (HEAD -> master, dev)
Merge: 35d79b0 a58bc3d
Author: ??? ??>
Date:   Tue Jul 3 10:04:53 2018 +0800

    Merge branch 'dev'

    * dev:
      在分支进行修改

    # Conflicts:
    #       result.txt

上面的Merge后面的两个id分别对应着master和dev,在反转的时候需要指定1或2,例如:
git revert -m 1 HEAD 则代表逆向操作master的merge
git revert -m 2 HEAD 则代表逆向操作dev分支的merge


那有人就要问了,你这个都是git revert一个提交,如果我要revert多个提交呢?看个例子就清楚了:

git revert master~5..master~2

逆向操作倒数第5个~倒数第3个提交,没错就是5到3,不反转倒数第二个操作。

至于按什么顺序执行的就执行验证一下好了。

你可能感兴趣的:(Git)