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. ...
随机推荐
- C# 如何调用WebServer函数
WebServer(ASMX)服务程序网站的编写简单总结. WebServer中遇到的问题 编写WebServer程序VS运行调试时如果出现 System.Data.OracleClient.Orac ...
- C# ~ 泛型委托
泛型 应用 1. 比较 2 个对象的大小? 参考 1. .NET面试题系列 - 对象大小比较:由一个泛型方法想到的 - 对象大小比较:
- webapi+entityframework分享
1. webapi允许跨域的增删改查要在web.config中加入以下文字 <system.webServer> <validation validateIntegratedMode ...
- int和Integer的区别
int是一种数据类型,Integer是一个类,有各种方法,如Integer.parseInt(string)等.
- 【Java每日一题】20161107
package Nov2016; import java.util.List; public class Ques1107 { public static void main(String[] arg ...
- How do I set the default schema for a user in MySQL
http://stackoverflow.com/questions/12426320/how-do-i-set-the-default-schema-for-a-user-in-mysql up ...
- 百度Java研发面经100题 总结
1. 单例模式常见的应用场景分析. 在23种设计模式中,单例模式排行老大.虽然理解简单,但是对于应用场景.你真正的熟悉么?使用单例,是由于没必要每个请求都新建一个对象,这样既浪费CPU又浪费内存:之所 ...
- 代码设置Shape和Selector
开发中经常需要使用Shape和Selector,如果每个都用xml设置的话,会占用apk大小,同时命名多了也会混乱,使用代码来设置会方便很多. 需要用到2个类:GradientDrawable和Sta ...
- MAC 卸载 openfire
顺序执行以下命令: sudo rm -rf /Library/PreferencePanes/Openfire.prefPane sudo rm -rf /usr/local/openfire
- viewport ——视区概念,为 自适应网页设计
什么是Viewport 手机浏览器是把页面放在一个虚拟的“窗口”(viewport)中,通常这个虚拟的“窗口”(viewport)比屏幕宽,这样就不用把每个网页挤到很小的窗口中(这样会破坏没有针对手机 ...