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. ...
随机推荐
- 【处理手记】U盘读不出+卷标丢失+像读卡器+大小0+无媒体
Update:201307180945 今天这鸟问题又找上我了,照之前的方法做后没解决,我又做了些尝试,整个流程如下: 1.插上U盘,发现问题 2.以devmgr_show_nonpresent_de ...
- autofac 注入中i遇到的泛型传参问题
using Autofac; using IService; using System; using System.Collections.Generic; using System.Linq; us ...
- Java总结篇系列:类型转换/造型
Java中,经常可以遇到类型转换的场景,从变量的定义到复制.数值变量的计算到方法的参数传递.基类与派生类间的造型等,随处可见类型转换的身影.Java中的类型转换在Java编码中具有重要的作用.首先,来 ...
- Java并发编程:并发容器之ConcurrentHashMap(转载)
Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concu ...
- JavaScript的DOM操作。Window.document对象
间隔执行一段代码:window.setlnteval("需要执行的代码",间隔毫秒数) 例 : window.setlnteval("alert("你 ...
- Oracle 数据库基础学习 (三) Oracle 四个表结构
Oracle 四个表的 emp dept salgrade bunus 的结构,记住有利于后期SQL语句的学习 雇员表(emp) No. 字段 类型 描述 1 empno NUMBER(4) 表示 ...
- Java知识体系
Java知识体系 java知识结构.jpg web框架.jpg 计算机课程体系.png 2016-08-19_090929.png 流行的哈希算法生存状况.jpg "JAVA之父" ...
- 用php模拟做服务端侦听端口
参考:http://www.cnblogs.com/thinksasa/archive/2013/02/26/2934206.html http://blog.csdn.net/alongken200 ...
- Photopile JS – 帮助你实现精致的照片堆叠效果
Photopile JS 是模拟照片散布堆叠在一起的 JavaScript/jQuery 图片库.点击缩略图,照片会弹出放大 ,再次点击照片会返回.缩略图是可拖动的,允许照片深深的堆在一起而不被覆盖, ...
- CamanJS – 提供各种图片处理的 JavaScript 库
CamanJS 是一个基于 Canvas 处理图片的 Javascript 库,结合简单易用的接口和先进高效的图像编辑技术.CamanJS 很容易扩展新的过滤器和插件,并伴随着一系列广泛的图像编辑功能 ...