一、问题描述
在利用github实现多人合作程序开发的过程中,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提交前的样子,本文总结了两种解决方法:回退(reset)、反做(revert)。

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

三、解决方法

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

适用场景:如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。

具体操作:
1. 查看版本号:
可以使用命令“git log”查看:

也可以在github网站上查看:

2. 使用“git reset –hard 目标版本号”命令将版本回退:

再用“git log”查看版本信息,此时本地的HEAD已经指向之前的版本:

3. 使用“git push -f”提交更改:
此时如果用“git push”会报错,因为我们本地库HEAD指向的版本比远程库的要旧:

所以我们要用“git push -f”强制推上去,就可以了:

在github图形化界面上看,远程库的HEAD也已经指向目标版本:

回退成功!

方法二:git revert
原理: git revert的作用通过反做创建一个新的版本,这个版本的内容与我们要回退到的目标版本一样,但是HEAD指针是指向这个新生成的版本,而不是目标版本。如下图所示,假设我们要回退到版本一,版本四的内容和版本一是一样的:

适用场景:如果我们想恢复之前的某一版本(该版本不是merge类型),但是又不想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法。

具体操作:
1. 查看版本号:
可以通过命令行查看:

也可以通过github网站图形化界面查看:

2.使用“git revert -n 版本号”反做,并使用“git commit -m 版本名”提交:
(1)反做,使用“git revert -n 版本号”:

(2)提交,使用“git commit -m 版本名”:

此时可以用“git log”查看本地的版本信息,可见多生成了一个新的版本:

3.使用“git push”推上远程库:

查看github上显示的远程库版本信息:

反做成功!
---------------------
作者:yxlshk
来源:CSDN
原文:https://blog.csdn.net/yxlshk/article/details/79944535
版权声明:本文为博主原创文章,转载请附上博文链接!

最新文章

  1. 【原创】JEECMS v6~v7任意文件上传漏洞(2)
  2. GDI+图形图像处理技术中Pen和Brush的简单使用和简单图形的绘制(C#)
  3. php Hash Table(二) Hash函数
  4. HDU-2571命运
  5. 离职了,在家温故而知新----1 设计模式 & 开头
  6. http://codeforces.com/contest/845
  7. Windows下如何创建低权限进程
  8. sqlserver 重置标识列
  9. cocos2d-x-3.x 学习总结(一)
  10. python2.7入门---内置函数
  11. Android 高逼格纯代码实现类似微信钱包带分割线的GridView
  12. C语言的产生
  13. call(),apply(),bind()区别?
  14. 数据分析---《Python for Data Analysis》学习笔记【02】
  15. Java斗地主案例、异常和自定义异常整理
  16. 用户和用户组y哦不过y哦那个好
  17. Java+Selenium自动化对非输入框的日历或日期控件的处理
  18. openstack,docker,mesos,k8s关系
  19. C# winfrom容器布局与工具栏&&右键菜单栏&&隐藏显示小图标的的简单事件
  20. JAVA中的array是通过线性表还是链表实现的呢?

热门文章

  1. Hadoop-2.2.0中文文档——Common-Hadoop HTTP web控制台认证
  2. [翻译] Working with NSURLSession: AFNetworking 2.0
  3. html 中怎么设置div的位置
  4. Python、Lua和Ruby比较——脚本语言大P.K.
  5. OpenCV学习(22) opencv中使用kmeans算法
  6. go语言基础之切片做函数参数
  7. 把表单转成json,并且name为key,value为值
  8. jQuery多媒体播放器插件jQuery Media Plugin使用方法
  9. Android -- 文件扫描
  10. Netdata Linux下性能实时监测工具