记一次尴尬的git reset丢失分支故障
最近...似乎一直在踩坑...
也不是什么故障,只是把一个分支的功能弄没了,之后在reflog里找到又恢复了.
产生原因是有同事错误地把分支B merge到了分支A并push.
我直接在分支A上reset到了merge前的一个节点(但这个节点其实是B分支的).
这导致分支A的头跑到了B分支上,A本来那个分支没有引用就丢了.
先说下解决方法,git reflog找到那个reset,或者直接用git fsck --no-reflogs --unreachable找到那个commit之后直接再reset回去即可.
主要原因是git merge之后的log会显示另一个分支的commit记录(毕竟没有真正的分支...).
这里简单重现下:
* dacbc52 (HEAD -> master) Merge branch 'a'
|\
| * 7b83cf6 (a) a commit
* | 9f4488b master commit
|/
* 47a0ab3 init
这样的一个分支情况,master merge了a节点产生2126这个commit.
这个时候看一下master的log,信息如下:
commit dacbc528153d48f3a210a9673ebc8148cfdb50d3
Merge: 9f4488b 7b83cf6
Date: Fri Jun 29 21:21:10 2018 +0800
Merge branch 'a'
commit 7b83cf6664cd5b84c5f66ef99f0fb39fb5ab57bd
Date: Fri Jun 29 21:19:59 2018 +0800
a commit
commit 9f4488ba008889b583205fc9405f4760150a2337
Date: Fri Jun 29 21:18:26 2018 +0800
master commit
commit 47a0ab3a70e7b4a663f99bc23542a51a90af152c
Date: Fri Jun 29 21:18:03 2018 +0800
init
可以看到a节点上的commit也被包含在了里面....(PS:之前我们使用的是hg,分支的概念有所不同,merge之后查看当前分支只是会显示本分支和merge节点,并且也没有git里的fast-forward概念)
误操作就是因为要撤销master的merge,执行了git reset --hard 7b83c(因为刚好是merge下面的第一个节点)
执行后的结果:
* 7b83cf6 (HEAD -> master, a) a commit
* 47a0ab3 init
可以看到default的结果已经不复存在了
找回的话
> git reflog
7b83cf6 HEAD@{0}: reset: moving to 7b83c
dacbc52 HEAD@{1}: merge a: Merge made by the 'recursive' strategy.
可以直接reset回dacbc52再进行正常操作
主要原因还是对于git的理解不深再加上之前使用hg的惯性产生了误判.
参考资料:
https://git-scm.com/book/zh/v1/Git-内部原理-维护及数据恢复
https://git-scm.com/book/zh/v1/Git-分支-分支的新建与合并
记一次尴尬的git reset丢失分支故障的更多相关文章
- git合并丢失代码问题分析与解决(错误操作导致)
问题描述 我们在主干dev和branch1分支上进行并行开发.当要把branch1功能的代码合并到dev上时,发现dev上开发的部分功能代码找不到了. 那么,是在branch1上,作了删除提交导致的吗 ...
- 代码回滚:git reset、git checkout和git revert区别和联系
git reset.git checkout和git revert是你的Git工具箱中最有用的一些命令.它们都用来撤销代码仓库中的某些更改,而前两个命令不仅可以作用于提交,还可以作用于特定文件. 因为 ...
- [转]恢复 git reset -hard 的误操作
转帖:http://hi.baidu.com/configuration/item/97fddeea252818d0eb34c964 有时候使用Git工作得小心翼翼,特别是涉及到一些高级操作,例如 r ...
- 每天一命令 git reset
在使用git的时候不免遇到commit的时候commit了错误的代码的时候,这时候就需要用到git的常用命令之一 reset了. reset顾名思义为重置.重置的是HEAD指针,可以使HEAD指针移 ...
- git 找回丢失的commit
From : http://dmouse.iteye.com/blog/1797267 git 的错误操作,导致丢失了重要的commit,真是痛不欲生: 最后通过git神器终于找回了丢失的commit ...
- [译]git reset
git reset 如果说git revert是一个安全的撤销方式, 那么git reset就是一个非常危险的方法了. 当你使用git reset撤销的时候, 你没有可能在回到最初了-他是一个永久的不 ...
- git中找回丢失的对象
本文转载自:http://gitbook.liuhui998.com/5_9.html 译者注: 原书这里只有两个链接: Recovering Lost Commits Blog Post,Recov ...
- 恢复 git reset -hard 的误操作
有时候使用Git工作得小心翼翼,特别是涉及到一些高级操作,例如 reset, rebase 和 merge.甚至一些很小的操作,例如删除一个分支,我都担心数据丢失. 不 久之前,我在做一些大动作(re ...
- 记一次小团队Git实践(下)
在上篇中,我们已经能基本使用git了,接下来继续更深入的挖掘一下git. 更多的配置自定义信息 除了前面讲的用户名和邮箱的配置,还可以自定义其他配置: # 自定义你喜欢的编辑器,可选 git conf ...
随机推荐
- JetBrains系IDE的设置Pycharm PHPStorm
一.换号边界线 File -> Settings ->Editor -> Code Style -> Right margin (columns) 二.代码自动完成快捷键 ...
- Nginx的使用(一)代理静态文件
1.为什要使用Nginx代理静态文件?这个问题去看静态资源快速加载. 2.作为后端服务器中间件,Tomcat是绝大多数Java程序员的选择.但是Tomcat处理请求的能力固然很强大,但是作为静态资源代 ...
- npm 安装cnpm淘宝镜像时报错解决
详细报错 D:\workspace\es61> npm install -g cnpm --registry=https://registry.npm.taobao.org npm WARN d ...
- SQL ServerAlways Encrypted Data
SQL Server 提供了一个加密表上字段的功能, Encrypt Columns , 比如身份证号码,手机号码,银行账户等等敏感信息.
- 使用Cors在WebApi中实现跨域请求,请求方式为angular的 $http.jsonp
使用Cors在WebApi中实现跨域请求 第一步,在webapi项目中安装cors 在Web API配置文件中(Global.asax)进行全局配置: public class WebApiAppli ...
- yarn一直在跑一个用户为dr.who的application
现象: 访问yarn:8088页面发现一直有任务在跑如图: 用户为dr.who,问下内部使用人员,都没有任务在跑: 结论: 恭喜你,你中毒了,攻击者利用Hadoop Yarn资源管理系统REST AP ...
- kali渗透-基础篇
渗透之meterpreter 模拟场景:小明是我室友,整天游戏人生,浑浑噩噩,前途迷茫,每次上课交作业都要看我的,于是我开启了apche服务器,给他下载作业(别问我为什么不用QQ传,因为要装逼!),他 ...
- Hive表生成函数explode讲解
Hive中的表分析函数接受零个或多个输入,然后产生多列或多行输出. 1.explode函数 explode函数以array类型数据输入,然后对数组中的数据进行迭代,返回多行结果,一行一个数组元素值 A ...
- JavaScript前端开发案例教程第二章练习
一.打印金字塔: 这是各种语言学习之处都要做的一道题,最近在重新学习js,看到了这个题,做一下记录. 1 <script type="text/javascript"> ...
- 使用gulp打包普通项目
前言: 在使用gulp打包工具之前,我做的H5项目在浏览器中的缓存是很严重的,若改了一点css,加了一句js代码,不手动清除浏览器缓存是看不到效果的.老总也在项目演示当中遇到这些问题,一查找原因却是缓 ...