git revert实战

1.reset revert区别

  • git reset是直接删除指定的commit,把HEAD后移动了一下

  • git revert是一次新的特殊的commit,HEAD继续前进,本质和普通add commit一样,仅仅是commit内容很特殊:提交的内容是与前面普通commit文本变化的反操作。比如前面普通commit是增加一行a,那么revert内容就是删除一行a

    由于reset方式HEAD指针后移,推送到远端时需要有强制更新权限或者删除分支权限,公司gforge设有权限限制,走不通。

2.revert commit

仅仅用于非merge操作的普通commit

假设按时间顺序依次有commit1, commit2, commit3,commit4,对应有version1, version2, version3, version4四个状态.

  • revert某次commit(例子中commit4,commit4不是merge,那么revert后包括commit4以及后面的commit都会被抵消,最终文件状态为commit4前,即version 3状态)

    git revert commit4

    [master 3a2ea91] Revert "version 4"
    1 file changed, 1 insertion(+), 2 deletions(-)

    git status

    #位于分支 master
    #您的分支领先 'origin/master' 共 1 个提交。#   (使用 "git push" 来发布您的本地提交)
    #
    无文件要提交,干净的工作区

    此时git push即可推送至远端

    push后有commit5(commit5即本次convert操作),对应着version5,刚好version5与version3的文件状态一致,因为version4及以后的修改被抵消掉了.

    revert过程有可能遇到冲突,要么git revert --abort终止此次revert操作,代码还原至revert命令前。要么手动消除冲突(同普通的冲突解决),然后add commit

3.revert merge

适用于merge操作的commit

假设当前状态:

commit 94ce4b8dcb898f730e6eecd73c00491f8020b67e
Merge: a2471f3 6a17d85
本次属于merge commit,注意Merge 标注
Author: 罗** <luo**@youku.com>
Date:   Fri May 20 11:03:53 2016 +0800

    merge

commit a2471f331c36a21d25aa158668cdc05987eef114
Author: 罗** <luo**@youku.com>
Date:   Fri May 20 11:03:01 2016 +0800

    verison 9

commit 6a17d85b04e52eddeb2ecb2a311804e10dada1e6
Author: 罗** <luo**@youku.com>
Date:   Fri May 20 11:02:10 2016 +0800

    version 8

commit 9441871ec2ff071e1a5be41646a32b2aea0b5502
Author: 罗** <luo**@youku.com>
Date:   Fri May 20 10:56:08 2016 +0800

    version 7

可以看到94ce4b8是一次merge commit,Merge 标注为Merge: a2471f3 6a17d85,意思是说当前分支commit a2471f3(version 9),加上来自其他分支的commit 6a17d85(version 8).此时要撤销94ce4b8所表示的merge.

如果不指定-m参数

git revert 94ce4b8dcb898f730e6eecd73c00491f8020b67e
error: 提交 94ce4b8dcb898f730e6eecd73c00491f8020b67e 是一个合并提交但未提供 -m 选项。
fatal: 还原失败

指定-m参数

 git revert 94ce4b8dcb898f730e6eecd73c00491f8020b67e -m 2
# 位于分支 develop
无文件要提交,干净的工作区

-m参数含义:Merge 标注为Merge: a2471f3 6a17d85,传1表示撤销到a2471f3所代表的commit,传2表示撤销到6a17d85所代表的commit。数字1,2表示的是标注冒号后的位置编号

上面例子中传参-m 2,所以撤销到6a17d85,最终文件状态与6a17d85 commit后一致(注意与上文差异),本例子中结果状态是“version 8”,不是version 7, git log确认结果如下:

commit 290c2f72d8d56d6be1008807450d4635095a549b
Author: 罗** <luo**@youku.com>
Date:   Fri May 20 11:32:34 2016 +0800

    Revert "merge"

    This reverts commit 94ce4b8dcb898f730e6eecd73c00491f8020b67e, reversing
    changes made to 6a17d85b04e52eddeb2ecb2a311804e10dada1e6.
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毫无疑问,Git已经成为当下分布式版本控制系统的翘楚。借助于Git强大的分支、合并、日志、历史追溯、rebase、submodule、subtree等一系列特性,开发者之间的协作变得越来越容易。 Git是由Linus Torvalds开发的;同时,Linus Torvalds也是Linux之父。他开发的这两款软件对于如今的互联网时代影响深远。目前,最为流行和强大的社交化代码平台GitHub上托管着大量项目,其中既有个人开发的、也有诸多优秀的开源项目,如jQuery、React、Netty、Redis、Kafka、Zookeeper等等。如果不充分利用这些优秀的代码宝藏,岂不是最大的遗憾。而且,除了GitHub外,业界还有优秀的in-house代码托管平台Gitlab,这也是国内诸多互联网公司所用的Git代码托管平台,它提供了极为庞大的优秀功能集;让我们可以将公司项目全部托管到其上,而不必担心网络速度问题或是隐私问题。 目前,已经有越来越多的项目开始或是准备开始从传统的svn向Git迁移,在这样的一个时代背景下,如果我们不去深入学习Git,将会真正错失这一切的美好。我时常说的一句话就是:“如果你还不会Git,那就不用再写代码了”! 相比于svn或是cvs等传统的集中式版本控制系统来说,Git的学习曲线是相当陡峭的。这导致很多学习者在学习一段时间后无法深入,而且由于没有真正、彻底地理解Git的原理与模型,使得即便掌握了不少Git命令,在真正遇到问题时也是束手无策,最终导致放弃学习,而且对Git形成了心理阴影。 纵然如此,优秀的Git依然是每一个对程序开发有追求的人都应该认真且完整地学习的。当你真正掌握了Git后,你才会真正领略到Git的美妙,以及为何有如此之多的开源项目都纷纷转向Git而抛弃svn。不得不说的是,Git涉及到的理论与命令是相当多的,这使得很多人望而却步,不知从何开始。 鉴于此,该门课程从一开始对Git进行全面的介绍,接下来全部通过命令完成一个个Git操作,并且通过命令来阐述Git相关的理论,同时对Git涉及到的方方面面特性进行了细致而完整的介绍,最后还通过演示如何搭建内网的Gitlab平台向大家介绍Gitlab在生产系统中使用与运维的诸多细节知识。可以这么说,学习完这门课程后,你对Git的掌握将会达到一个非常深入的水准,你对Git的理解也将会有颠覆性的认知。 值得注意的是,学习Git一定要动手敲命令而不能借助于IDE帮助我们完成操作,否则你永远也无法体会到Git的强大以及为开发者所带来的便利。对于Git常见的命令与参数,一定要通过多练习来强化记忆,将其变成自己血液的一部分。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值