git版本回退, github版本回退

上周提交了更改,过了周末回来说要撤销上个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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据之美

flask 流式响应 RuntimeError: working outside of request context

1、问题 最近要实现这样一个功能:某个 cgi 处理会很耗时,需要把处理的结果实时的反馈给前端,而不能等到后台全完成了再咔一下全扔前端,那样的用户体验谁都没法接...

2407
来自专栏张戈的专栏

Infinity New Tab:重新定义你的Chrome新标签页

Infinity new tab 是一款实用又清新的 Chrome(谷歌浏览器)新标签页功能扩展,可以完美替代默认的新标签页。受插件作者邀请,我特意安装体验了一...

32612
来自专栏Hadoop实操

如何在CDH中安装和使用StreamSets

StreamSets由Informatica前首席产品官Girish Pancha和Cloudera前开发团队负责人Arvind Prabhakar于2014年...

2K9
来自专栏架构师之旅

Git基础和规范-协同开发

关于版本控制 什么是版本控制: 官方说法:版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统,你可以对任何类型的文件进行版本控制。 ...

2025
来自专栏Java3y

数据链路层

数据链路 (data link) 除了物理线路外,还必须有通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。

550
来自专栏walterlv - 吕毅的博客

Automatically increase the semantic version using GitVersion

发布于 2018-04-18 12:51 更新于 2018-09...

282
来自专栏情情说

git分支管理和工作流规范:基本概念说明

「单点登录与权限管理」系列第二部分,Demo项目的设计和开发,需要一段时间才能完成。这段时间,会把以前学习、实践、梳理过的知识分享给大家,希望大家能够喜欢。

3158
来自专栏技术分享

聊下 git rebase -i

在使用git作为源代码管理工具的时候,开发的时经常会面临一个常见的问题,多个commit 需要合并为一个完整的commit提交。 在一个基本的迭代周期里,你会有...

1719
来自专栏orientlu

Git 使用记录 - 各种撤销

以上操作用于撤销保存在工作区修改,但是不会撤销暂存区中的修改。 由于修改还没记录到 git 中,撤销无法恢复,请慎重!

743
来自专栏纯洁的微笑

谈谈我与 Intellij IDEA 的故事

说到这款 IDEA,很早就想写一篇关于它的文章了,可不知从何处写起,刚好一位师弟问起我来,正好写一篇入门文章,本文的涉及的快捷键主要针对于 Windows系统「...

572

扫描关注云+社区