记一次git amend事故处理方案
一、问题回顾
问题是git commit --amend 引起的。 一条commit已经push到远端develop了,但是后来又在这条commit上进行了amend操作,导致这条commit的哈希码发生了变化。并且后续又在这条commit之后进行了N条commit操作。
<Begin>
大概的情况画了个简图,如图所示。下面的绿色就是最后相同的地方,红色的那条做的是相同的功能message是一样的,但是提完develop之后又改动了很多然后使用amend挤压了。
这个时候比较头疼了,因为那条amend的commit里面是发生了太多改动,我采用的是可以避免冲突的方法,但是会改develop的commit树
git checkout develop git reset 2c4532 //上面97,98,99的改动会被放出来 git stash //先把这些改动存起来 git reset --hard 5d67bc //等于是把96完全剔除了,代码回到了95的状态 git cherry-pick 8a6f7f //把那一条修改后的功能commit(96的feature)粘贴过来,这一步100%不会有冲突 git stash pop //把之前存起来的那些改动再放出来,这一步不能保证100%无冲突,但实际由于两个功能模块离得比较开,所以也没有发生冲突。 git add . git commit -m " " //把develop上面的97,98,99三条commit 挤压成了一条后commit git cherry-pick 86f6cc d34c7 2817f5 //这一步把feature分支的97,98,99三条commit粘贴过来,因为这三条基本是基于8a6f7f开发的,所以也没有发生冲突。 董铂然博客园
<End>
这样改完之后develop的commit树如上图所示(第97条就是把之前的97,98,99挤压成的1条),可以编译通过功能都能实现。 但是缺点是这时候需要强推develop了。
组里另一个人提出的解决方案是
<Begin>(图再贴一遍 省的往上翻)
git checkout feature //操作都在feature分支进行,不动develop的代码 git reset 5d67bc //把feature分支上“不科学”的commit 96,97,98,99 全部放出来 git stash //全部临时存起来 git rebase develop //快进一下,合入了所有develop的新代码 100%无冲突 git stash pop //把之前揉在一起的4条commit的代码一起放出来,这时候会有大量冲突。 git add . git commit -m "fix" //解决冲突后commit一下 //然后再把最后的一条commit merge入develop,最后的结果时develop如下
<End>
可以看出这种做法,不需要强制push develop的代码。理论上更加科学,但是中间需要解决大量的冲突。
事后反省一下,觉得两种方法其实各有优劣,如果组内成员不多,可以在大家的监督下 完成强推develop的操作。 因为解决了大量冲突可能会比 非常清晰了解差异后-f强推develop更容易出现错误。 当然如果是大型项目,几十人团队,并且远端都绑上了编译检查,和merge规则的项目也只能使用第二种方法了。
二、其他经验
对于一个码农而言,比写出bug更恐怖的是把代码弄丢了或弄乱了。 对于这种问题也是有一种统一的解决方案
①.git reset --hard 哈希码 , 这条非常普遍,如果出现问题有点乱直接回到一个安全的commit
②.git reflog 对于有rebase或merge这种操作,第一条指令就用不了了,因为被污染的并不仅仅是最后一条commit。 这时要用这个万能恢复指令,回到一个操作的哈希码。
③.但是前两种方法都是对于一些已经加入过git的代码进行恢复。 如果一些代码还没有commit 这时候弄丢了 那些指令就都帮不了你了。 这时候只能看IDE有没有local history了。(local history相当于IDE帮你实现了一个类似于git的功能)之前就有过一次第3种情况的经历,当时是把没commit的代码给reset了 使用localhistory得以恢复。好在现在iOS的xcode 和 Android的Android Studio都是有local history的,
- Xcode 的local history在 导航栏 → View → Version Editor → show Version Editor
- Android Studio 的local history在 左边文件目录 → 选中根目录 → show local history
如果上文说的问题有更好的解决方案,也欢迎一起讨论。
记一次git amend事故处理方案的更多相关文章
- 记一次git merge 事故
最近发生在自己身上的一件矬事儿,一不小心把matser上别人的代码给冲掉了,事后追溯了下原因. 1.准备三个分支,分别从master拉取 realease/v1.0分支 和 realease/bugf ...
- CPU使用率终于正常了——记一次订餐系统事故处理
引子 经过漫长的等待,儿子终于出生了.欣喜之余,就是各种手足无措,顾此失彼了.因为不懂,心里总是慌慌的,有点小毛病,恨不得一步就到医院. 婆媳育儿观念的差异,让心乱如麻的我,又成了风箱里的老鼠,两个不 ...
- 记一次重大生产事故,在那 0.1s 我想辞职不干了!
一.发生了什么? 1.那是一个阳光明媚的下午,老婆和她的闺蜜正在美丽的湖边公园闲逛(我是拎包拍照的). 2.突然接到甲方运营小妹的微信:有个顾客线上付款了,但是没有到账,后台卡在微信支付成功(正常状态 ...
- 记一次git fatal: Unable to find remote helper for 'https'问题的解决
登陆到远程linux服务器上,使用git, clone的时候报“fatal: Unable to find remote helper for 'https'”错,没管,绕过,使用git clone ...
- [Git] --amend
Change a Commit Message that Hasn't Been Pushed Yet If you make a mistake in a commit message but HA ...
- 记一次git翻车事件
昨天dmp上线了 本来整个流程是 1.在本地1.4分支开发,开发完成push到origin/1.4,在远程仓库把1.4 merge到master分支 2.本地online分支先pull一下远程onli ...
- 记一次Git提交报错的问题
通常代码版本控制的步骤是: 在代码版本控制平台新建一个仓库 clone远程仓库到本地 开始编码,然后是一系列add,commit,push 我的步骤是: 在远程代码版本管理平台新建一个仓库 在本地新建 ...
- 记一次小型生产事故 | BeyondComper跨编码方式复制文件内容
前言 今天组长在做站内巡检的时候,发现header内有一条meta标签的content显示为乱码. <meta name="description" content=&quo ...
- 记一次线上事故的JVM内存学习
今天线上的hadoop集群崩溃了,现象是namenode一直在GC,长时间无法正常服务.最后运维大神各种倒腾内存,GC稳定后,服务正常.虽说全程在打酱油,但是也跟着学习不少的东西. 第一个问题:为什么 ...
随机推荐
- 1199 Problem B: 大小关系
求有限集传递闭包的 Floyd Warshall 算法(矩阵实现) 其实就三重循环.zzuoj 1199 题 链接 http://acm.zzu.edu.cn:8000/problem.php?id= ...
- Xamarin和微软发起.NET基金会
新闻<微软宣布成立.NET基金会全面支持开源项目 包括C#编译器Roslyn>,看到大家对微软的开放都很兴奋.在此之前在.NET社区也有了大量的开源项目,所列的24个项目也是早就开源,这次 ...
- 关于Linux和Windows下部署mysql.data.dll的注册问题
mysql ado.net connector下载地址: http://dev.mysql.com/downloads/connector/net/ 选择版本: Generally Available ...
- 程序猿是如何解决SQLServer占CPU100%的
文章目录 遇到的问题 使用SQLServer Profiler监控数据库 SQL1:查找最新的30条告警事件 SQL2:获取当前的总报警记录数 有哪些SQL语句会导致CPU过高? 查看SQL的查询计划 ...
- SQL开发技巧(二)
本系列文章旨在收集在开发过程中遇到的一些常用的SQL语句,然后整理归档,本系列文章基于SQLServer系列,且版本为SQLServer2005及以上-- 文章系列目录 SQL开发技巧(一) SQL开 ...
- ABP框架 - 多层结构
文档目录 本节内容: 简介 ABP结构 多层 其它层(通用) 领域(Core)层 应用层 基础层 Web & 表示层 其它 总结 简介 一个应用的代码库的分层是一个广为接受的技术,用来减少复杂 ...
- Atitit 会话层和表示层的异同
Atitit 会话层和表示层的异同 会话层 这一层也称为会晤层或对话层.在会话层及以上的更高层次中,数据传送的单位没有另外再取名字,一般都可称为报文. 会话层虽然不参与具体的数据传输,但它却对数据传输 ...
- iOS 关于PCH文件(全局文件)的介绍
1.pch文件是什么 pch文件即 扩展名为.pch的预编译文件.是将工程中较稳定的不会经常修改的代码预先编译好,放在一个公共的文件(.pch)里. 2.pch 文件的作用 A.存放宏. 比如 #d ...
- Python 资源大全中文版
Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-python 是 vinta 发起维护的 Python 资源列 ...
- Dreamweaver 扩展开发:文档路径等信息的处理
//browseFile(fieldToStoreURL){ //getFullPath(filePathURL){ //getSimpleFileName() { //fixUpPath(docUR ...