设为首页 收藏本站
查看: 994|回复: 0

[经验分享] 记一次git amend事故处理方案

[复制链接]

尚未签到

发表于 2018-1-15 09:37:23 | 显示全部楼层 |阅读模式
一、问题回顾
  问题是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
  如果上文说的问题有更好的解决方案,也欢迎一起讨论。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-435256-1-1.html 上篇帖子: git remote/client 学习笔记 下篇帖子: git config命令使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表