美文网首页
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