开发者社区> ryan-miao> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

git版本回退, github版本回退

简介: 上周提交了更改,过了周末回来说要撤销上个story。于是,需要找到上周提交的版本,rollback回来。 git版本管理命令,自从习惯使用管理工具之后就很少接触了,当突然寻找其他指令的时候就成浆糊了,ctrl+k只能顺利的提交而无关管理。
+关注继续查看

上周提交了更改,过了周末回来说要撤销上个story。于是,需要找到上周提交的版本,rollback回来。

git版本管理命令,自从习惯使用管理工具之后就很少接触了,当突然寻找其他指令的时候就成浆糊了,ctrl+k只能顺利的提交而无关管理。因此,工具简化操作却弱化了技能。就像前几天听到的BBC 6分钟英语的一段对话。

Rob说他当年在酒吧实习,对钱的加减算法很熟悉很强,因为那时候计算机还没有推广。

计算器的出现使人们放弃了自己计算的本领。有时候即便仅仅是简单的加减法也不愿用自己的脑袋计算了。不说好坏,自己的感觉非常糟糕,因为觉得自己曾经拥有的技能消退了而难过。所以说,加强自身而不完全依赖于外物还是很重要的。

 

 

# Attention

更多Git以及Github的用法,参阅[Github工作流的正确打开方式](http://www.cnblogs.com/woshimrf/p/git-workflow.html)

 

# 结论放开头

- 不要在公共分支做reset, 不要修改公共分支的历史 

- 使用revert不会改变历史,只是增加一个版本

 

1.reset

几个月前,我提交了一次更改,这个更改涉及几十个文件,提交到github,Jenkins build,然后health check 503 error。看着报错我毫无头绪,不明白health check究竟是因为代码的哪部分造成的,这提醒我以后的错误日志一定要详细。但有一点是肯定的,这次提交的更改有问题。既然上一次的代码没问题,那就回退吧。

我在本地,使用git reset current branch to here. 这是Intelij自带的git管理工具,可以指定版本后,然后回退到指定版本。本质上就是 git  reset 版本号。

显然,这个指令就是将head指针后退了一下,也就是说,当前版本是落后的。而我从master的最新一次提交reset到倒数第二个,那么我的当前的版本比maser落后一次提交。

既然回退好了,需要merge到master上面。对应到github上就是pull request.然而,当我选择pull request的时候显示nothing.说本次更改不用merge。也就是说master的历史中已经包含了这个版本,所以不用merge。

因此,如果想要合并分支,那么要合并的分支必须比当前分支的版本先进。显然,reset只能重置本地或者说本分支的更改。那么,我如果想要mater回退,我必须提交一个比mater先进而且内容正好的是上一次提交的相反的修改。这就是revert干的事情。

 

2.revert

revert指定版本可以实现版本回退。这个不是像reset一样指针回退,而是会创建一个新的提交,而且将指定版本的修改逆过来。这样,我们想回退的内容被逆反修改过来了,而且我们的版本比master先进。这样就可以直接提交了。

 

 

具体做法:

假设当前git log为:

G1 - G2 - G3 - B1 - B2 - B3

 G1-G3 正确的,好的,但  B1-B3 需要丢弃。

如果这些log都是在本地分支,那么可以使用reset:

$ git reset --hard HEAD~3

注释:
 B3 as HEAD, B2 is HEAD~1, B1 is HEAD~2. 好的 G3 is HEAD~3:
G1 - G2 - G3 - B1 - B2 - B3
           \    \    \    \-- HEAD
            \    \    \------ HEAD~1
             \    \---------- HEAD~2
              \-------------- HEAD~3



但是如果这些log提交已经在远程分支了,那就只能使用
 revert:
$ git revert --no-commit HEAD~2^..HEAD

Or:

$ git revert --no-commit HEAD~3..HEAD


注释:
--no-commit是说虽然HEAD~2到HEAD的提交已经被回滚了,但回滚的内容会放在缓存区,需要stage后commit才能生效。
这里,"start..end"的意思是不包含start,包含end。




注意

1. Merge操作不能revert
2. 对于使用IDEA做开发的,推荐使用IDEA自带的回退。查看log,然后点击需要回退的文件,右键revert。
3. 回退要慎重,很容产生冲突。


参考

git代码回滚:Reset、Checkout、Revert的选择

Git - how to revert multiple recent commits

 





唯有不断学习方能改变! -- Ryan Miao

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Github客户端以及Git shell的使用
昨天介绍了怎么使用Git Shell来commit我们的代码,但是这都是简单的操作,我们还没有使用到Github是怎么进行版本控制的呢。所以,今天就来介绍一下,怎么来做版本控制吧。
851 0
Github项目搜索技巧! 教你高效地在GitHub上寻找开源项目
本篇文章是一篇Github项目搜索技巧介绍的文章。主要帮助大家如何熟练使用Github的搜索来找到自己想要的项目。介绍了项目名称搜索,项目详情搜索以及项目描述搜索几种方式。最后介绍了如何寻找到一个高质量的,值得学习的项目。通过这篇文章的指导,可以让你高效地寻找到优秀的开源项目来提升自己的项目经验。
164 0
iOS开发拓展篇——如何把项目托管到GitHub
iOS开发拓展篇——如何把项目托管到GitHub   说明:本文主要介绍如何把一个OC项目托管到Github,重操作轻理论。   第一步:先注册一个Github的账号,这是必须的   注册地址:Github官网注册入口 第二步:准备工作   gitHub网站使用Git版本管理工具来对仓库进行管理,注意它们并不等同。
1010 0
Git之Eclipse提交项目到Github并实现多人协作
一.Eclipece提交项目到Github     见  eclipse提交项目到github   二.利用github组织实现多人协作 1.新建组织: New organization 1.
1056 0
eclipse提交项目到github
1.在https://github.com   new repository 2.在eclipse中new project  比如:Test项目 3.右击"Test"->Team->share project...  ->select a repository type:Git 勾选  Use or create repository in parent folder of project 点击  Create Repository  ->  Finish 这时候打开在workspace中的Test目录会发现多了一个.git文件夹。
656 0
利用Travis CI 让你的github项目持续构建
      Travis CI 是目前新兴的开源持续集成构建项目,它与jenkins,GO的很明显的特别在于采用yaml格式,简洁清新独树一帜。目前大多数的github项目都已经移入到Travis CI的构建队列中,据说Travis CI每天运行超过4000次完整构建。
983 0
如何把项目托管到GitHub
一.进入GitBash   红圈部分是clone的仓库所在地址,从左面左上角的Administrator或者C:\Users\Administrator.PC-201505250855都可以进入。
1258 0
+关注
ryan-miao
A Java developer.
文章
问答
文章排行榜
最热
最新
相关电子书
更多
AGit-Flow:新一代高效Git协同模型
立即下载
AGit-flow:新一代高效Git协同模型
立即下载
新一代高效Git协同模型
立即下载