一、背景知识
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
image.pnggit log
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.png2、进行 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
网友评论