先做一些前情提要:

我们项目使用git作为代码管理,同时为了操作更方便,安装了乌龟git(tortoiseGit)工具。以下几乎所有操作都是在乌龟git上进行。

我们的项目是分阶段完成的,在完成上一阶段后,把这个版本定位v1.04,这个版本的代码是要准备部署给客户的,要和其他模块进行整合测试,

而这时,我们依然有其他开发任务,所以我在这个代码库上建立了develop分支。 原分支为master。 则原代码的bug,我们都会在master分支上修改,

然后合并到develop分支上,而新的开发任务,就都在develop分支上开发。这本来是没有问题的,很和谐的进行的一段时间后。。。

---------------------------------------------------------------------------------------------------------------------------

在今天,我查看代码的时候,发现应该只出现在develop分支上的代码竟然出现在了master分支。在查了很久(可能半个小时吧)的git 历史后,加上分析,

才想到是因为其他开发人员的误操作,可能推送时推错了分支,或者是修改master时,先拉取了deveop分支的内容,修改后推到了master分支。原因我无法确诊了。

反正结果是master分支上出现了deveop分支的代码。既然如此,就必须做些什么。

对这个问题,我希望达到的效果是,将develop分支的改动从master分支上清除。但由于问题发生了挺长一段时间后才被发现(至少一个月),在错误的操作之后,在两个分支上都有多次正确的提交。

在经历半个早上的痛苦挣扎后,基本上把解决方法确定了,我要做的事情如下:

1. 找出最晚一次在master分支上正确的提交。即最近且正确的master分支状态。还原到这次提交上。下简称称为originalMaster。

2. 找出这之后的所有对master的正确提交,将这些提交逐个合并到originalMaster上。

清楚这个思路之后,就开始找这个originalMaster,但是由于之前的误操作,导致git的版本树非常混乱。所以又经历了一段时间的痛苦查看,在混乱的版本树里翻查,终于在下午找到了可以作为originalMaster的提交。

根据原本的想法,还原到这次提交后,再根据版本树查看这个分支上的各次提交(一般来说一个分支的提交记录都在同一条竖线上),大概回忆一下,肯定这些提交都是正确的,就逐步使用“merge to 当前分支名”功能,把改动合并到当前分支下(为了安全,我先建了一个revert_master_test分支,在该分支上进行试验)。

把全部正确的提交都合并后,就在我以为万事大吉时,我再次查看代码,竟然发现develop的改动还是存在,我马上再查看revert_master_test分支的历史,发现由于有几次正确的master提交是基于错误的master分支状态进行修改的(即master分支当时已被误合并,导致包含了develop分支的内容),所以现在的分支中才会包含了develop的内容。我逐个查看revert_master_test分支的提交节点,查看提交的情况,并点开查看文件的改动内容。 发现有一次提交包含了很多的develop版本的改动(我猜测全部develop的改动都在这里面了),这就是上面提到的在误合并后的master分支上改动的提交。我鼠标右击这次提交,发现有一个选项:“还原这个版本的改动”,里面出现“第一父节点”和“第二父节点”选项, 分别表示这次合并与2个父节点的差异(该提交跨了2个分支),其中“第一父节点”中,包含了develop分支的改动,我选中“第一父节点”后,发现真的将里面的改动都还原了。

我再大致看一下代码,发现develop分支的改动确实都没有了。 好了,世界清净了。

剩下的就是生成解决方案,确认代码正确, 大致检查几个关键的文件,看是否已还原develop的改动。

最后,就是想办法让master分支变成这个状态,可能会用revert功能,revert到revert_master_test分支上。或是其他办法,应该不会太难。

好了,记录完了。 长吁一口气。

这次用到几个关键的功能:

0.勾选“show whole project”查看项目的完整提交历史

1.revert到某次正确的提交上

2.把每个正确的提交逐个“merge to”当前分支

3.用"revert change by this commit"功能把某次提交的改动清除

git代码库误操作还原记录的更多相关文章

  1. 微软打造了全球最大的Git代码库

    丹棱君有话说:今年 2 月,微软宣布将用 Git 管理 Windows 源代码.随后,Visual Studio 宣布开发 “Git 虚拟文件系统(GVFS)”,并将在终极项目和超大型团队中推行 Gi ...

  2. 使用git checkout 指定git代码库上的指定分支

    因为曾经一直是在用svn,到狼厂,大家都用Git. 哥的开发环境:IntelliJ 说说简单的操作过程吧. 1.检出Git代码库 cd到指定文件夹 git clone http://..../andr ...

  3. git代码库的使用

    代码库/使用指南 http://learn.zone.jd.com/cmsuser/index.htm 在win7系统下使用TortoiseGit(乌龟git)简单操作Git@OSC http://m ...

  4. 针对远程Git代码库使用SSH公匙

    → 运行Git Bash→ 创建SSH公匙和私匙ssh-keygen -t rsa→ 输入SSH公匙存放文件,选择使用默认的,按Enter→ 如果已经存在,提示是否重写,输入n,按Enter→ 打开C ...

  5. Winform开发框架之权限管理系统改进的经验总结(4)-一行代码实现表操作日志记录

    在前面介绍了几篇关于我的权限系统改进的一些经验总结,本篇继续这一系列主体,介绍如何一行代码实现重要表的操作日志记录.我们知道,在很多业务系统里面,数据是很敏感的,特别对于一些增加.修改.删除等关键的操 ...

  6. Git - Git版本库相关操作

    创建Git版本库 如下命令实现在“E:\GitCode\01_TestGit”路径下,01_TestGit项目的Git版本库. $ cd E: #将当前目录转到E盘下 $ cd GitCode    ...

  7. centos7.2下编译安装&&使用-git代码库

    centos7.2下编译安装git Git简介 Git是一个分布式版本控制系统 Git vs SVN SVN是典型的集中式版本控制起,版本库集中存放在服务器,当我们用自己的电脑干活儿的时候,需要先从中 ...

  8. git操作——git pull 撤销误操作,恢复本地代码

    需求 开发的代码还未commit到git本地仓库,就从git远程仓库上pull了代码,导致开发的代码直接被冲掉,需要退回到上一个版本代码. 操作 进入到项目git本地仓库文件夹下 打开cmd窗口,执行 ...

  9. sql2008 误操作还原至指定时间点

    --drop database db --创建一个测试库 create database db go --备份一个完整备份文件 backup database db to disk = 'd:\db. ...

随机推荐

  1. C#反射技术概念作用和要点

    反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的 ...

  2. wcf和web service的区别

    1.WebService:严格来说是行业标准,不是技术,使用XML扩展标记语言来表示数据(这个是夸语言和平台的关键).微软的Web服务实现称为ASP.NET Web Service.它使用Soap简单 ...

  3. Android的px、dp和sp

    Android的px.dp和sppx: 即像素,1px代表屏幕上一个物理的像素点:偶尔用到px的情况,是需要画1像素表格线或阴影线的时候. dp: 这个是最常用但也最难理解的尺寸单位.它与“像素密度” ...

  4. 炉石传说 C# 开发笔记

    最近在大连的同事强力推荐我玩 炉石传说,一个卡牌游戏.加上五一放一个很长很长的假期,为了磨练自己,决定尝试开发一个C#的炉石传说. 这件事情有人已经干过了,开发了一个网页版的炉石,但是貌似不能玩... ...

  5. MongoDB学习-安装流程

    MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型. ...

  6. Win10环境下安装theano并配置GPU详细教程

    一.软件和环境 (1)安装日期2016/12/23: (2)原材料VS2013,cuda-8.0(最好下载cuda7.5,目前theano-0.8.2对cuda-8支持不是很好),Anaconda3- ...

  7. PHP内核探索之变量(1)Zval

    作为数据的容器,我们常常需要跟变量打交道,不管这个变量是数字.数组.字符串.对象还是其他,因而可以说变量是构成语言的不可或缺的基础.本文是PHP内核探索之变量的第一篇,主要介绍zval的基本知识,包括 ...

  8. JavaScript寄生组合式继承分析

    JavaScript寄生组合式继承特点: 避免了在子类prototype上创建不必要多余的属性,相比直接继承基类的实例效率要高. 是JavaScript 实现继承的最有效方式. <script& ...

  9. 15个优秀的 Material Design(材料设计)案例

    Material Design (材料设计)是由谷歌创建和设计的一种设计语言,结合成功的设计的经典原则以及创新科技.谷歌的目标是开发一个设计系统,让所有的产品在任何平台上拥有统一的用户体验.全新的设计 ...

  10. Java2_J2EE、J2SE和J2ME的区别

    解析J2EE.J2SE.J2ME.JDK的区别       本文向大家简单介绍一下JDK.J2EE.J2SE.J2ME概念及区别,J2EE,J2SE,J2ME是java针对不同的的使用来提供不同的服务 ...