git撤销的两种方法 reset和revert

714 阅读3分钟

1,问题描述

在利用git实现多人运动(指尖运动)的时候,我们难免会出现错误提交,这个时候我们肯定不想手动把代码改回来,我们可以利用git提供的两种解决办法:回退(reset)、反做(revert)

2,解决办法

方法一:git reset(回退)

原理:git reset的作用是修改HEAD的位置,将head指针指向之前存在的某个版本 适用场景:如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不想要了,就可以用这种方法 具体操作:

1,比如这里,最近的三条提交记录,comment为“four”的代表添加了第四行,每次提交只添加了一行,这个时候如果我们想回到添加第二行的版本, 我们只需要用如下的命令

git reset --hard a79cc00fe990f58edec253a6a35d5f7be6b37a2d

这个时候文件已经回到添加第二行的这个版本了 再使用git log查看提交记录

可以发现,这个时候第三和第四的提交记录已经没有了, 然后我们再用 git push -f就可以强制提交到远程分支,看下远程分支的提交记录
可以发现,远程的记录第三和第四的提交记录也是一样没有了。 这里关于reset 的参数需要特别说明下: git仓库分为如下三个区域:

名称 用途
HEAD 上一次提交的快照,下一次提交的父节点
INDEX 预期的下一次提交的快照,可以理解为暂存区
WORKING Directory 工作目录

我们正常修改代码时在working directory中进行的,然后用git add将工作区文件添加到暂存区,git commit 提交文件到我们的分支,所以在git reset [--soft | --mixed | --hard] []命令中,

参数 用途
--soft 只更改head指针的指向,不改变暂存区和工作区
--mixed(默认参数) 更改head指针的指向,更改暂存区
--hard 更改head指针的指向,更改暂存区,更改工作区

方法二:git revert (反做)

原理: git revert的作用是创建一个新的commit,以达到撤销该版本的修改的目的,比如我们有三个commit(commit1,commit2,commit3),顺序是commit1 -> commit2 -> commit3,突然我们发现commit2有非常大的bug问题,需要紧急撤销掉commit2的内容, 但是不能影响后续的commit3的提交,这个时候我们就可以使用revert命令来满足我们的需求。

案例:

这里我们有两个最近的提交“add 5,6”和“add 3,4”,其中“add 5,6”添加了5和6两个数字,“add 3,4”添加了3和4两个数字,然后我们想把3和4的数字revert掉,我们找到“add 3,4”的版本号,直接

git revert -n 3b5fd40f90e4d85acabd569a048d4501b51d08cc

这个时候冲突了,我们解决下冲突就可以提交了。 至于为什么会有冲突,网上找了下答案:

然后我们再来看下不同文件的revert,index5是添加了index5.txt这个文件,index4是添加了index4.txt这个文件

我们有多个commit,这个时候我们想把index4.txt给撤销了,我们可以直接revert

这个时候发现index4.txt被删掉了,但是index5.txt还在