最近...似乎一直在踩坑...

也不是什么故障,只是把一个分支的功能弄没了,之后在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丢失分支故障的更多相关文章

  1. git合并丢失代码问题分析与解决(错误操作导致)

    问题描述 我们在主干dev和branch1分支上进行并行开发.当要把branch1功能的代码合并到dev上时,发现dev上开发的部分功能代码找不到了. 那么,是在branch1上,作了删除提交导致的吗 ...

  2. 代码回滚:git reset、git checkout和git revert区别和联系

    git reset.git checkout和git revert是你的Git工具箱中最有用的一些命令.它们都用来撤销代码仓库中的某些更改,而前两个命令不仅可以作用于提交,还可以作用于特定文件. 因为 ...

  3. [转]恢复 git reset -hard 的误操作

    转帖:http://hi.baidu.com/configuration/item/97fddeea252818d0eb34c964 有时候使用Git工作得小心翼翼,特别是涉及到一些高级操作,例如 r ...

  4. 每天一命令 git reset

    在使用git的时候不免遇到commit的时候commit了错误的代码的时候,这时候就需要用到git的常用命令之一  reset了. reset顾名思义为重置.重置的是HEAD指针,可以使HEAD指针移 ...

  5. git 找回丢失的commit

    From : http://dmouse.iteye.com/blog/1797267 git 的错误操作,导致丢失了重要的commit,真是痛不欲生: 最后通过git神器终于找回了丢失的commit ...

  6. [译]git reset

    git reset 如果说git revert是一个安全的撤销方式, 那么git reset就是一个非常危险的方法了. 当你使用git reset撤销的时候, 你没有可能在回到最初了-他是一个永久的不 ...

  7. git中找回丢失的对象

    本文转载自:http://gitbook.liuhui998.com/5_9.html 译者注: 原书这里只有两个链接: Recovering Lost Commits Blog Post,Recov ...

  8. 恢复 git reset -hard 的误操作

    有时候使用Git工作得小心翼翼,特别是涉及到一些高级操作,例如 reset, rebase 和 merge.甚至一些很小的操作,例如删除一个分支,我都担心数据丢失. 不 久之前,我在做一些大动作(re ...

  9. 记一次小团队Git实践(下)

    在上篇中,我们已经能基本使用git了,接下来继续更深入的挖掘一下git. 更多的配置自定义信息 除了前面讲的用户名和邮箱的配置,还可以自定义其他配置: # 自定义你喜欢的编辑器,可选 git conf ...

随机推荐

  1. resource links

    http://cenalulu.github.io/linux/all-about-cpu-cache/

  2. qqluxc

    因为现在noi/noip都是无限栈 noi-linux开栈指令 ulimit -s 102400 这个是100mb 平衡树*2 维护序列 翻转 平衡树+1 维护区间+* t了3个点.. 注意打完标记 ...

  3. C++11 带来的新特性 (4)—— 匿名函数(Lambdas)

    1 语法 Lambdas并不是新概念,在其它语言中已经烂大街了.直接进入主题,先看语法: [ captures ] ( params ) specifiers exception attr -> ...

  4. 2018-2019-2 20165319 《网络对抗技术》 Exp5:MSF基础应用

    实验内容 metasploit中有六个模块分别是 渗透攻击模块(Exploit Modules) 辅助模块(Auxiliary Modules 攻击载荷(Payload Modules) 空字段模块( ...

  5. 难受的ESlint语法检测

    相信写过vue的各位小白都有过这样的体验,明明引入的文件语法是对的,明明自己写的代码是对的,但是总会报语法错误,没错,就是ESlint代码检测搞的鬼, 就算你在注释后面多打一个空格,它都会去搞事情,简 ...

  6. 《团队作业》五小福团队作业--UNO-- LandingDay--降落

    <团队作业>五小福团队作业--UNO-- LandingDay--降落 写在前面 几周的飞行之后,降落之日也如期而至了.在2018年12月19日我们顺利地完成了项目的总结汇报.但是,短暂的 ...

  7. 安装VUE Cli3 框架方法

    下面为大家介绍一下怎样安装  VUE Cli3的步骤 官网地址  https://cli.vuejs.org/zh/guide/installation.html 一.首先要检查一下是否安装node环 ...

  8. SQL 收缩日志

    USE [master]ALTER DATABASE RcBalance SET RECOVERY SIMPLE WITH NO_WAITALTER DATABASE RcBalance SET RE ...

  9. Unity 图形处理(切分与拉伸)

    素材的导入设置 1.导入的图片要设置为 Sprite 才能作为UI使用 2.如果需要进行切分,Sprite Mode 选择 Multiple 进行切分和拉伸设置 1.点击进入精灵编辑视图 2.点击按钮 ...

  10. java创建文件写入内容,并实现下载该文件

    public void getText(){ response.setHeader("Content-Disposition", "attachment;filename ...