先做一些前情提要:

我们项目使用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#利用浏览按钮获得文件路径和文件夹路径

    生成文件夹路径 private void btnChoose_Click(object sender, EventArgs e) {            using (OpenFileDialog ...

  2. 火狐浏览器+Firebug+FirePath测试Xpath

    前言 抓取网页数据时使用HtmlAgilityPack分析,需要通过xpath定位页面元素.如果有个xpath的生成和验证工具就事半功倍了,火狐浏览器插件FirePath配合Firebug就能完美实现 ...

  3. 背水一战 Windows 10 (7) - 控件 UI: VisualState, VisualStateManager, 控件的默认 UI

    [源码下载] 背水一战 Windows 10 (7) - 控件 UI: VisualState, VisualStateManager, 控件的默认 UI 作者:webabcd 介绍背水一战 Wind ...

  4. Hibernate---detached entity passed to persist一个解决方法

    1.查看id生成策略,2.查看是否是手动设置的id :3.查看实体对象映射配置是否正确. 例如: public Emplopes(String name, char gender) { super(n ...

  5. MUI(3)

    本篇博文是继续上篇博文MUI(2).上面这幅图是博文MUI(1)中实现的效果,在博文MUI(1)中提到了2个页面,一个页面是index.html,另一个页面是index_list.html页面.上面这 ...

  6. Statement和PreparedStatement的区别; 什么是SQL注入,怎么防止SQL注入?

    问题一:Statement和PreparedStatement的区别 先来说说,什么是java中的Statement:Statement是java执行数据库操作的一个重要方法,用于在已经建立数据库连接 ...

  7. gcd和ex_gcd

    gcd就是欧几里得算法,可以快速的求出俩个数的最大公因数,进而也可以求其最大公倍数(俩数之积除以最大公因数),比较简单直接看代码就好了,一般用递归版,简短精简,敲得快,但如果数剧奇葩,怕溢出,那就用递 ...

  8. 《Java4Android》视频学习笔记——为什么用抽象类?

    我们来举个例子,然后引出这个问题的答案: 市面上有 喷墨式打印机 和 针式打印机 这两种形式的打印机,我们需要编程来实现他们的 开机,关机以及打印. 构建父类Printer class Printer ...

  9. 市面上常见的javaEE WEB服务软件

    常见的市面上web服务软件 Tomcat:轻量级的WEB应用程序服务器(开源),开源组织Apache的产品.免费的.支持部分的JavaEE规范.(servlet.jsp.jdbc,但ejb, rmi不 ...

  10. node.js 抓取网页数据

    var $ = require('jquery'); var request = require('request'); request({ url: 'http:\\www.baidu.com',/ ...