热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

记一次git的版本回退

背景本地有个项目已经修改了很久(是自己的小项目不是公司的),文件挺多的,还有大量的log文件。一些资源文件是中文名,工作区修改后使用了命令gitadd.本来在.gitignore文

背景


本地有个项目已经修改了很久(是自己的小项目不是公司的),文件挺多的,还有大量的log文件。一些资源文件是中文名,工作区修改后使用了命令 git add .



本来在.gitignore文件中设置一下就好了,但是实践隔了有点久,忘了这事,就手贱都将工作区修改过的文件提交到暂存区了……然后也就忽略了上传文件大小限制的事情就commit然后push了!




首先我们能看到这样的报错!这时候查看github上的项目没有推送成功的,还好!也就是说现在要解救的就是本地的版本库了。



  • 翻译这些错误:前面是自己的文件大小,后面说的是这文件已经超过了github文件大小限制100MB


那我了解到github是1G的空间,单个文件限制100MB,超过50MB的文件会警告!




  • 这时我们要是希望能够提前预防,第一,那么用好.gitignore文件,省心,大文件直接过滤掉。第二,add的时候不要放入大文件,也不要轻易add all,要选择性的即使将工作区的文件提交到暂存区,不追踪大文件!

好了,我们再回归怎么才能解决已经出现的问题!


解决思路


撤回版本库中的版本:git revert和git reset

两者的区别:前者revert是用一次新的commit来回滚之前的commit,单纯从‘回滚’这一操作上看,根本没太大区别,但是在以后如果进行merge的时候,版本记录会出现区别,revert相当于用一次你想的commit来中和之前的提交,因此在日后合并的时候,这部分改变不会再次出现,但是reset是相当于把某个commit在branch上删除掉,所以在branch再次merge的时候这些会馆的commit还是会被引入。

而且,git reset是将HEAD的指针向后移动了下,而git revert还是会让HEAD指针前进指针会指向新生成的commit版本。

先说一个远端已经push成功的例子!

如图:



此时,HEAD指针已经在提交D上了,A和B是正常提交,如果此时我们使用git reset --hard 2esdfc(B编号的前六位,我随便编的)那我们的C和D两次提交就不复存在了



但是远程的HEAD指针依然不变,这样要是push的话只能git push -f这样不是很好,所以更推荐用revert。

git revert D git revert C

这两个命令执行成功后,会生成两个新的提交D和C,我们这里称为d,c比较好区分。而且,原来错误的提交记录还在,如果有争议的时候还可以找出提交记录。并且这时就可以直接git push了。


从开头对reset的命令解释,大概就是如果中间出现错误提交,此时用reset,那么之后大家的提交版本都会消失,那么还是推荐revert,生成新的提交记录,使HEAD指针继续向前走。

回到我们的问题,我的问题并没涉及远端仓库,只是本地的commit记录,大致问题如下:



我的目标是将HEAD指针回退到B提交,这种情况也是最简单的问题,这也是我一个人的项目,不涉及远端和其他人分支merge的问题,所以直接reset解决即可,C的版本可以丢弃,将版本库中的文件退会到工作目录中去,其实就是想保留文件的改动,并且从暂存区中剔除跟踪。



  • 这就得先了解reset的三种模式了:--hard ,--mixed,--soft


使用这个命令前需要保证work tree是干净的。用图说明一下各个命令后的效果。




  • --soft:保留工作目录,并把重置HEAD所带来的差异放入暂存区(index)

  • --hard: 直接重置index和work tree,也就是说所有的更改均被丢弃,也就是说你白干了,上次coomit后的内容全都白干!

  • --mixed:只要reset后不加任何模式参数,其实就是mix模式,清空index暂存区,但保留工作目录work tree,换句话说就是将所有差异都丢进工作区。正是我们想要的效果



注意22:30那个提交记录,2e17e5



这是改动记录,太多



使用了--soft HEAD^ 就是回退上一个版本的意思,偷懒了,不想写那六位数编码。因为想看看soft的效果,所以这里使用的是soft。



这时我们再用一次git reset就好了,保留work tree即可。

至此我们还是乖乖地去ignore文件中添加不想被跟踪的文件吧,免得下次又提交不上去。


至于gitignore文件的设置规则:大致想‘#’设置注释,剩下的规则和linux文件匹配差不多。

例如:/log/* 是忽略log文件夹下的所有目录和文件的意思


#匹配规则和linux文件匹配一样
#以斜杠“/”开头表示目录;
#以星号“*”通配多个字符;
#以问号“?”通配单个字符
#以方括号“[]”包含单个字符的匹配列表;
#以叹号“!”表示不忽略(跟踪)匹配到的文件或目录


推荐阅读
  • 先记住几个专用名词,如下:Workspace:工作区IndexStage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库一、新建代码库#在当前目录新建一个G ... [详细]
  • 本文详细介绍了git常用命令及其操作方法,包括查看、添加、提交、删除、找回等操作,以及如何重置修改文件、抛弃工作区修改、将工作文件提交到本地暂存区、从版本库中删除文件等。同时还介绍了如何从暂存区恢复到工作文件、恢复最近一次提交过的状态,以及如何合并多个操作等。 ... [详细]
  • Git GitHub多人协作
    在学校做一个小项目需要多人协作,就用到了gitHub,百度了一下多数写得乱七八糟或者支离破碎,于是总结了一下自己的步骤如下,第一次使用GitHUb,哪里不对望大神指出一.前期准备: ... [详细]
  • 双十一在家学用 Git
    对于所有的开发者来说,掌握一门代码版本控制系统都是必须的,无论是自己做项目,团队合作,工作中的合作,都离不开版 ... [详细]
  • 初始化初始化本地空版本库,仓库,英文名repositorymkdirtest&&cdtestgitinit克隆项目到本地gitclone远程同 ... [详细]
  • git向远程仓库提交遇到的各种坑
    **码云***gitinit初始化本地仓库gitinit*gitremoteaddorigingitgithub.com:xueqinngchennLocal-agent.git将 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文介绍了在git中如何对指定的commit id打标签,并解决了忘记打标签的问题。通过查找历史提交的commit id,可以在任意时间点打上标签。同时,还介绍了git中的一些常用命令和操作。 ... [详细]
  • 序言n前言nn第一章概述1n1.1简单插件实例——创建带孔板有限元模型2n1.2Abaqus图形界面程序开发的意义10nn第二章Python语言基础11 ... [详细]
  • SVN 功能说明(简版)
    Subversion(SVN)是什么?SVN是一种版本管理系统,是开源软件的基石。即使在沟通充分的情况下,多人维护同一份源代码的一定也会 ... [详细]
  • 前言本篇为大家总结社区多人合作常见的场景和对应的git操作命令。本篇非新手教程,阅读本篇前需具备Git基础知识。Git入门教程请参考https://www ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
author-avatar
花落---守护者
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有