一、问题回顾

问题是git commit --amend 引起的。 一条commit已经push到远端develop了,但是后来又在这条commit上进行了amend操作,导致这条commit的哈希码发生了变化。并且后续又在这条commit之后进行了N条commit操作。

<Begin>

大概的情况画了个简图,如图所示。下面的绿色就是最后相同的地方,红色的那条做的是相同的功能message是一样的,但是提完develop之后又改动了很多然后使用amend挤压了。

这个时候比较头疼了,因为那条amend的commit里面是发生了太多改动,我采用的是可以避免冲突的方法,但是会改develop的commit树

git checkout developgit 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 挤压成了一条后commitgit 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事故处理方案相关推荐

  1. git amend如何撤销

    本文参考自https://blog.csdn.net/woai8339/article/details/90447901 git amend 作用 我们知道git amend作用是合并当前的改动至上一 ...

  2. 记一次Git抽风现场

    这两天世界最大的猴类交友社区GitHub也被国人给攻陷了,只因国人在github建了一个仓库996.ICU,目的召集众猿人共同声讨996加班制度,有一种现实版猩球大战的节奏.何为996?就是朝9晚9连 ...

  3. 记一次 Git GitHub 实操

    记一次 Git & GitHub 实操 1.前言 之前写了一个名为 typora-tools 的小工具,主要实现了图片瘦身.标题编号.图片同步的功能,现在想将此项目上传至 GitHub 中,并 ...

  4. 记一次生产数据库事故

    记一次生产数据库事故 事故起因 事故故事 事故现场 事故起因 最后在做报表,报表的数据产生是直接在只读库上面进行的.但因数据量大需要对表做优化,现行优化方式为简单粗暴的加索引. 另外说明一数据库用的是 ...

  5. git amend详解和撤销

    git amend 详解和撤销 git amend详解 git amend 作用 git amend如何撤销 git amend详解 git amend 作用 git 在现在的开发中使用频繁,解决了很 ...

  6. 电脑上免费的记笔记软件怎么切换皮肤配色方案?

    随着社会的发展和科技的不断进步,很多人在工作当中所用到的笔记软件跟前些年相比有了天翻地覆的变化.对于很多年轻人来说,在选择笔记软件的时候,除了考虑他们的功能之外,对外观的要求也非常严格.免费的记笔记软 ...

  7. 服务器上使用 git 更新 wordpress 内核方案

    目录结构.场景设想 推荐目录架构结构: /opts/mysite/ -/wordpress/ -/wp-config.php -/index.php *wordpress 要加入到 .gitignor ...

  8. CPU使用率终于正常了——记一次订餐统事故处理

    引子 经过漫长的等待,儿子终于出生了.欣喜之余,就是各种手足无措,顾此失彼了.因为不懂,心里总是慌慌的,有点小毛病,恨不得一步就到医院. 婆媳育儿观念的差异,让心乱如麻的我,又成了风箱里的老鼠,两个不 ...

  9. 记一次 Git 操作的糟心之旅

    开发一天, 最后下班的时候, 要合并到master上, 结果呢, 出现报错 Please move or remove them before you can merge. Aborting 然后百度 ...

最新文章

  1. EasyUI 1.3.6 行号显示不全
  2. PowerDesigner165安装婆姐汉花教程
  3. java 识别手机_java – 如何识别手机闲置?
  4. python输入多个数字 找出只出现一个的数字_在python数组中找到接近给定数字的多个值...
  5. Django:ORM基本操作-CRUD,管理器对象objects,----->查询1(all,values,values_list,order_by)
  6. mysql 主从 binlog_mysql 主从 binlog
  7. Facebook广告与Google广告有什么不同?
  8. SQL卸载重装实例名重复问题
  9. 数据结构 传统链表实现与Linux内核链表
  10. Win7电脑中毒解决过程复盘
  11. GEE学习总结(2)——点矢量绘制与坐标系问题
  12. linux系统常用命令-1--lsblk
  13. c++、C#互调用之c# 调用 vc6 COM
  14. 李氏第二法分析稳定性matlab,9-4李雅普诺夫稳定性分析2010.ppt
  15. ADS(Advanced Design system)使用调谐分析(Tuning)进行电路优化
  16. Oracle EBS DBA培训提纲
  17. 经典查找算法 --- B+树
  18. Mac电脑访问不了正常URL
  19. Java校验时间段重叠
  20. 【SpringMVC】拦截器和过滤器

热门文章

  1. nagios常见问题
  2. request获取url的参数编码问题
  3. 关于js的一些常用小知识点(持续更新)
  4. jSignature签名的用法,一文教会你(二)后台代码
  5. collection集合 多少钱_面试必备-Java集合框架
  6. c语言float二进制输出代码_C语言学习笔记——学前知识概述
  7. 电脑显示器不亮主机正常_电脑主机已开机 显示屏却不亮(看完秒懂)
  8. java中Date类、DateFormat及SimpleDateFormat简介
  9. java throws catch_java中throws与try...catch的区别点
  10. 深度优化LNMP之PHP