美文网首页
Git revert —— 与 reset 的关系,以及reve

Git revert —— 与 reset 的关系,以及reve

作者: 若琳丶 | 来源:发表于2021-01-09 18:03 被阅读0次

    一、背景知识

    1.1 git的版本管理,及HEAD的理解

    使用git的每次提交,Git都会自动把它们串成一条时间线,这条时间线就是一个分支。如果没有新建分支,那么只有一条时间线,即只有一个分支,在Git里,这个分支叫主分支,即master分支。有一个HEAD指针指向当前分支(只有一个分支的情况下会指向master,而master是指向最新提交)。每个版本都会有自己的版本信息,如特有的版本号、版本名等。如下图,假设只有一个分支:


    image.png

    1.2 应用需求

    在利用github实现多人合作程序开发的过程中,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提交前的样子,本文总结了两种解决方法:回退(reset)、反做(revert)。
    有些文章提到revert 的意思是 “反做”,但我感觉“反做”这个词不太好理解。从现象上来看,对 revert 的简单理解,就是将历史的某个 commit 给“去掉”,并创建保留这次“去掉”的提交记录。

    1.3 demo 环境

    两个分支:

    • master
    • dev

    二、Git reset

    说 revert,不得不跟 git reset 进行对比。reset 的含义是“回滚到某次 commit”。

    2.1 Git reset 原理

    git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本,如下图所示,假设我们要回退到版本一:


    image.png

    2.2 Git reset 操作

    2.2.1 查看 commit

    git log

    image.png

    2.2.2 执行 reset

    git reset --hard af77582da9efed41c7564c82832e901617558e4c

    执行之后我们在看 commit 记录,发现当前版本已经回退到目标版本了。


    image.png

    2.2.3 push 至远程

    之后只需要将这次本地 reset 操作同步到远程。

    git push origin dev -f

    此处的 -f 等同于 --force,两者都是表示强制覆盖的意思。


    image.png

    我们在用 git log 命令去查看 commit 记录,发现已经同步给远程了。


    image.png

    2.3 reset 总结

    git reset 比较好理解,版本遇到问题用它也最方便。但是 reset 比较暴力,操作之后没有痕迹,这样不免感觉有些虚。接触 revert 前,我也只会用 reset,但是一旦 reset 出现了误差,commit 多往前选了几个,那就会误删很多有可能很重要的内容。

    引用文章中某个评论的一个说法:

    最重要的一点:revert 是回滚某个 commit ,不是回滚“到”某个

    三、commit

    commit 有两种:一种是常规 commit,一种是 merge commit。
    常规 commit 比如:


    image.png

    merge commit 比如:


    image.png

    四、Git revert 操作

    为了进行操作demo,现在文件中分别加入三次编辑,并分别提交。


    image.png
    image.png

    4.1 常规 commit

    4.2 操作同一个文件

    使用 git revert <commit id> 即可,git 会生成一个新的 commit,将指定的 commit 内容从当前分支上撤除。(此处 revert 后面加不加 -n 都可以)

    image.png

    执行后发现,出现版本冲突。


    image.png

    这是因为三次提交都是对同一个文件进行操作,所以 revert 操作会出现冲突。此时我们需要解决冲突,然后在进行提交。


    image.png
    这种情况,只能在解决冲突的时候,手动的将 “第一次修改” 的内容进行删除(但是手动删除进行合并,总感觉可能会出现误操作,本以为就算出现冲突,也可以自动的判断出目标版本所涉及的内容,并进行去除,但是没有找到类似的case和方法)。在处理完之后,就可以commit + push了。
    image.png

    4.3 操作不同的文件

    还是在 dev 分支,我们准备三个空文件。然后在这三个文件中分别加上文件名,分三次修改,三次提交。然后我们来测试 revert 第一次修改和提交。


    image.png

    1、查看 commit 记录

    image.png

    2、进行 revert 操作

    我们 revert 的目标版本是 first 的那次操作,对应的 commit_id 为 51a5db8d9c144b993ef5c3155f46b97baede45d5。

    git revert 51a5db8d9c144b993ef5c3155f46b97baede45d5

    此时会直接弹出 commit message 的编辑界面


    image.png

    编辑完成之后,就可以push 至远程了,此时我们看一下提交记录,就可以发现我们 revert 操作对应的 commit 了。


    image.png

    此时我们再打开 first 文件,发现已经没有了内容;而 second 和 third 文件中的内容依然保留。

    引用:
    https://segmentfault.com/a/1190000012897697
    https://blog.csdn.net/yxlshk/article/details/79944535
    https://www.talktocomputer.site/blogs/83/
    https://zhuanlan.zhihu.com/p/45510728

    相关文章

      网友评论

          本文标题:Git revert —— 与 reset 的关系,以及reve

          本文链接:https://www.haomeiwen.com/subject/bypcaktx.html