最近...似乎一直在踩坑...
也不是什么故障,只是把一个分支的功能弄没了,之后在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 +0800Merge branch 'a'commit 7b83cf6664cd5b84c5f66ef99f0fb39fb5ab57bd
Date:   Fri Jun 29 21:19:59 2018 +0800a commitcommit 9f4488ba008889b583205fc9405f4760150a2337
Date:   Fri Jun 29 21:18:26 2018 +0800master commitcommit 47a0ab3a70e7b4a663f99bc23542a51a90af152c
Date:   Fri Jun 29 21:18:03 2018 +0800init

可以看到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-%E5%86%85%E9%83%A8%E5%8E%9F%E7%90%86-%E7%BB%B4%E6%8A%A4%E5%8F%8A%E6%95%B0%E6%8D%AE%E6%81%A2%E5%A4%8D
https://git-scm.com/book/zh/v1/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E6%96%B0%E5%BB%BA%E4%B8%8E%E5%90%88%E5%B9%B6

转载于:https://www.cnblogs.com/fairjm/p/git_reset_lose_branch.html

记一次尴尬的git reset丢失分支故障相关推荐

  1. git reset --mixed, - soft和--hard有什么区别?

    我希望拆分提交,不知道要使用哪个重置选项. 我在看页面你能解释一下"git reset"用简单的英语做什么吗? ,但我意识到我并不真正理解git索引或临时区域是什么,因此解释没有帮 ...

  2. git reset --hanrd撤回_一篇文章,全面掌握Git

    版本控制 版本控制就是记录项目文件的历史变化.它为我们查阅日志,回退,协作等方面提供了有力的帮助. 版本控制一般分为集中化版本控制和分布式版本控制. 集中化主要的版本数据都保存服务端. 分布式版本数据 ...

  3. 掌握 git reset 使用

    通常我们提交代码一般都是 git add ,git commit -m, git push 的这么个流程.添加到暂存区,提交到 git 库生成版本号,push 到远程仓库以供他人可以使用.这是一个完整 ...

  4. git reset 怎么还原_git reset --hard 操作后的数据恢复

    在进行正文之前先简单介绍下git reset 命令 git reset git reset 命令用于改变当前的仓库状态,简单的场景用例:假设一次修改了两个文件,然而需要对这两个文件分别进行两次提交,在 ...

  5. git reset --hard xxxxxxx

    关于git reset --hard xxxxxxx命令之Git版本回退 今晚代码写着写着就头脑有点发懵,手指也不听使唤了竟然让我敲出了 git reset --hard 命令,然后的然后就是之前所有 ...

  6. Git reset , revert, checkout的区别和联系

    转自: http://www.cnblogs.com/houpeiyong/p/5890748.html 拿来做个笔记 git reset.git checkout和git revert是你的Git工 ...

  7. 如何使用'git reset --hard HEAD'恢复到之前的提交? [重复]

    本文翻译自:How do I use 'git reset --hard HEAD' to revert to a previous commit? [duplicate] This question ...

  8. git中找回丢失的对象

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

  9. git reset 怎么还原_git reset –hard后的恢复操作

    先说下我遇到的问题和解决办法,然后再放原文. 我遇到的问题 在初始化一个比较大的项目时,由于最后一次commit的文件数量较大,无法成功push,百度无果后想要撤回这次commit,于是手贱用了git ...

最新文章

  1. mysql免费框架_瞧一瞧~看一看~MyCat架构剖析免费不要钱!(上)
  2. 关于Arrays类总结
  3. SQL Server 2012中的Contained Database尝试
  4. c#读蓝牙数据_客户端实现蓝牙接收(C#)知识总结
  5. boost::contract模块实现check的测试程序
  6. 在二维数组中查找一个数
  7. 双向口 与 准双向口 区别
  8. mysql fn_2019 数据库趋势报告,最受欢迎的是 MySQL
  9. java ant教程_ant教程(三) ant入门
  10. 解决路由环路问题的探讨
  11. notepad++运行python/C/C++/perl32
  12. linux下c语言图形界面实现,「分享」C语言如何编写图形界面
  13. Python:Django面试题
  14. QQ大盗 - 巧用clientkey
  15. C语言一些常用结点和结点操作
  16. zookeeper-入门介绍架构使用(这一篇足以)
  17. 到底什么是叶脊网络?
  18. LINUX使用rm误删文件后恢复
  19. Android系统开发之烧录开发板
  20. 企业财务制度二--(三)所有者权益类科目 3111 资本公积(转载)

热门文章

  1. 八款JS框架介绍及比较
  2. mybatis中SqlSession一定要关闭
  3. 数独游戏技巧从入门到精通_中国茶艺技巧:500集从入门到精通教程,视频+素材+笔记...
  4. 角点检测--基于梯度的方法(Moravec角点检测、Harris角点检测、Shi-Tomasi角点检测)
  5. 百面机器学习第一章——特征工程(基本是百面机器学习书的内容)
  6. C++/C--相对路径与绝对路径【转载】
  7. FFmpeg--命令详解
  8. No migrations to apply.(django不能创建数据库中的表的问题)makemigrations/migrate
  9. Struts2中EL表达式的取值范围问题
  10. python 水位_Leetcode 42. 接雨水 - python - 递归 查找分水岭