在多人合作程序开发的过程中,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提交前的样子,本文总结了两种解决方法:回退(reset)、反做(revert)。
使用git的每次提交,Git都会自动把它们串成一条时间线,这条时间线就是一个分支。如果没有新建分支,那么只有一条时间线,即只有一个分支,在Git里,这个分支叫主分支,即master分支。有一个HEAD指针指向当前分支(只有一个分支的情况下会指向master,而master是指向最新提交)。每个版本都会有自己的版本信息,如特有的版本号、版本名等。如下图,假设只有一个分支
本篇文章git版本是:
css
$ git --version
git version 2.10.2.windows.1
方法一:git reset
原理:
git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本,如下图所示,假设我们要回退到版本一:
适用场景:
如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法
具体实践
我的例子是3个文件test01.txt ,test02.txt ,test03.txt,都说新增txt分别对应第一次,第二次,第三次提交。
我们先使用git log -3
命令来查看日志(-3代码查看最近3条记录):
总共3次提交,假如我要恢复到第二次提交,那么如下命令:
git reset --hard 621f4006ccad957945b8deba17c6d72131f67443
HEAD is now at 621f400 说明HEAD现在已经指向第二次提交了
再用"git log"查看版本信息,此时本地的HEAD已经指向之前的版本
第三次提交的日志已经没有了。然后使用git push -f
提交更改: 此时如果用git push
会报错,因为我们本地库HEAD指向的版本比远程库的要旧
此时已经没有test03.txt了,说明reset把第二次提交之后的提交全部清除了。
方法二:git revert
原理
git revert是用于"反做"某一个版本,以达到撤销该版本的修改的目的。比如,我们commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。如下图所示
适用场景
如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法
具体实践
还是上面的例子,现在是3个文件
还是反做第二次提交,先git revert -n commit_id
一下【注意:使用-n
是应为revert后,需要重新提交一个commit信息,然后在推送。如果不使用-n
,指令后会弹出编辑器用于编辑提交信息(commit信息 git commit -m '编辑的是这里的信息'),编辑完之后不需要 执行git commit
命令了】
git revert -n 82ca415620e1f797ff0389a7dc591d456808f1b2
再通过git status
查看发现 有需要提交的
最后git commit
提交
我们再查看日志情况:
发现新出现了一次提交记录,并且第三次提交的内容没有被清空,
这个时候我们再git push
一下
发现test02.txt已经没有了,但是第三次提交的test03.txt还是在的
总结:
reset:回滚到某个commit,此commit之后的所有commit都会一同跟着消失回退。
revert:将某一个commit反做,此commit内容会被撤销,并生成一个全新的commit,此commit保留了撤销的commit之前之后的其他commit。