git代码库误操作还原记录
先做一些前情提要:
我们项目使用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代码库误操作还原记录的更多相关文章
- 微软打造了全球最大的Git代码库
丹棱君有话说:今年 2 月,微软宣布将用 Git 管理 Windows 源代码.随后,Visual Studio 宣布开发 “Git 虚拟文件系统(GVFS)”,并将在终极项目和超大型团队中推行 Gi ...
- 使用git checkout 指定git代码库上的指定分支
因为曾经一直是在用svn,到狼厂,大家都用Git. 哥的开发环境:IntelliJ 说说简单的操作过程吧. 1.检出Git代码库 cd到指定文件夹 git clone http://..../andr ...
- git代码库的使用
代码库/使用指南 http://learn.zone.jd.com/cmsuser/index.htm 在win7系统下使用TortoiseGit(乌龟git)简单操作Git@OSC http://m ...
- 针对远程Git代码库使用SSH公匙
→ 运行Git Bash→ 创建SSH公匙和私匙ssh-keygen -t rsa→ 输入SSH公匙存放文件,选择使用默认的,按Enter→ 如果已经存在,提示是否重写,输入n,按Enter→ 打开C ...
- Winform开发框架之权限管理系统改进的经验总结(4)-一行代码实现表操作日志记录
在前面介绍了几篇关于我的权限系统改进的一些经验总结,本篇继续这一系列主体,介绍如何一行代码实现重要表的操作日志记录.我们知道,在很多业务系统里面,数据是很敏感的,特别对于一些增加.修改.删除等关键的操 ...
- Git - Git版本库相关操作
创建Git版本库 如下命令实现在“E:\GitCode\01_TestGit”路径下,01_TestGit项目的Git版本库. $ cd E: #将当前目录转到E盘下 $ cd GitCode ...
- centos7.2下编译安装&&使用-git代码库
centos7.2下编译安装git Git简介 Git是一个分布式版本控制系统 Git vs SVN SVN是典型的集中式版本控制起,版本库集中存放在服务器,当我们用自己的电脑干活儿的时候,需要先从中 ...
- git操作——git pull 撤销误操作,恢复本地代码
需求 开发的代码还未commit到git本地仓库,就从git远程仓库上pull了代码,导致开发的代码直接被冲掉,需要退回到上一个版本代码. 操作 进入到项目git本地仓库文件夹下 打开cmd窗口,执行 ...
- sql2008 误操作还原至指定时间点
--drop database db --创建一个测试库 create database db go --备份一个完整备份文件 backup database db to disk = 'd:\db. ...
随机推荐
- Oracle命名规范
1.编写目的 使用统一的命名和编码规范,使数据库命名及编码风格标准化,以便于阅读.理解和继承. 2.适用范围 本规范适用于公司范围内所有以ORACLE作为后台数据库的应用系统和项目开发工作. 3.对象 ...
- 基于Ionic2的开源项目
项目介绍 基于Ionic2的Ionic中文论坛客户端,该应用也是边学边做的,为了将更多常用东西加入到APP中,有些逻辑不通之处,敬请包涵. 开源地址 https://github.com/zxj963 ...
- spring的事务操作
我们项目一期已经差不多结束了,所以一些细节也被拿了出来,出现最多的就是事务的操作了.因为自己负责的是一个模块(因为是另外一个项目的负责人),所以组员经常会遇到事务的问题,会出现很多奇葩的用法,各种乱用 ...
- 第 28 章 CSS3 多列布局
学习要点: 1.早期多列问题 2.属性及版本 3.属性解释 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS3 提供的多列布局,通过多列布局我们方便的创建流体的多列布局. 一.早期多列问题 我们 ...
- Scalaz(24)- 泛函数据结构: Tree-数据游览及维护
上节我们讨论了Zipper-串形不可变集合(immutable sequential collection)游标,在串形集合中左右游走及元素维护操作.这篇我们谈谈Tree.在电子商务应用中对于xml, ...
- InfluxDB学习之InfluxDB的HTTP API写入操作
HTTP API也有两种操作:写入和查询,本文就先给大家介绍一下 InfluxDB的HTTP API的写入操作方式. 在InfluxDB学习的上一篇文章:InfluxDB学习之InfluxDB ...
- js中对象使用
简单记录javascript中对象的使用 一.创建对象 //创建一个空对象 var o={}; //创建一个含有两个属性的对象,x.y var o2={x:12,y:'12',name:'JS'}; ...
- mongodb数据库备份导入导出数据
备份数据: mongodump -h 192.168.2.20 -u game -p 12345678 -d dbname -o /data/test/ --excludeCollection=use ...
- Android异步回调中的UI同步性问题
Android程序编码过程中,回调无处不在.从最常见的Activity生命周期回调开始,到BroadcastReceiver.Service以及Sqlite等.Activity.BroadcastRe ...
- JMeter专题系列(一)工具简单介绍
一.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静态和动态资源的性能,例如:静态文件, ...