1.起因

这个问题要从今天刚遇到的事儿说起,昨晚代码出了个乌龙事件,本来正在dev分支进行新功能的开发,但是测试出现的问题是在release 分支上,当时就想到使用stash 将正在开发的dev已经修改的代码 暂时存下来,然后切换到master,重新checkout -b 一个新的fix branch进行代码修复测试, 但是当我测试完成,fix bug ,push到远程仓库后,切换到dev分支进行继续开发时,

一顿操作猛如虎,结果错把

git stash pop 0

敲成了

git stash drop 0

当时内心骂出了 what fuck, 心想,这咋办,难不成要重新凭记忆重来一次,可是关键是修改了那么多的地方,代码虽然都是自己写的,但是重新来写,心里是有一万个不愿意啊。于是google了stash 回退, 嘿, 还真有同我一样曾经手一抖毁所有的经历。 于是就把这个问题重新整理一下。

2. 问题出现

  1. 使用git stash list 显示所有stash列表



    说明:

    stash 0,1,2: 说明暂存了三次的缓存, 0 表示最新的一条

    使用git stash show 0 可以显示具体修改某一次的详情, 详情包括某个分支(dev),本地缓存log md5 02a2ba5f

  2. 错误使用指令

    git stash drop // 默认删除的是最近stash save的一次



    该指令意思时 将暂存的最新一条缓存删除掉了, 当再次执行 git stash list的时候,最近一次git stash save 已经没有显示。

    正确使用取出某一次的stash记录应该使用:git stash pop 0

  3. 再次查看 stash , 发现stash 列表只有两次缓存项目了。

3.修复

git 并没有删除包含了我的更改的对象,它只是移除了对它的引用。

为了证明这一点,我使用命令 git fsck,它会验证数据库中对象的连接和有效性.

  1. 使用了参数 --unreachable,我让 git-fsck 显示出所有不可访问的对象。

    正如你看到的,它显示不可访问的对象。而当我从 stash 中删除了我的更改之后,表示这些对象是不可以访问的:

    通过 管道符可以过滤出commit的所有丢失的的缓存

    过滤出来这么多的不可访问的对象, 但是并不知道哪一个是刚刚被删除的那个。 这个排序并不是按时间顺序显示

  2. 使用 git show commit-log 查看详情(需要通过执行命令 git show来搜索每一个对象。)

    git show d5ba741a6349936c479aa3f900e53faa3372ae7f

    就是它!

    ID 号d5ba741a6349936c479aa3f900e53faa3372ae7f 对应了我的更改。

    现在我已经找到了丢失的更改,我可以恢复它。其中一种方法是将此 ID 取出来放进一个新的分支,或者直接提交它。

  3. 恢复,将更改再次恢复应用到dev 分支上。

    git stash apply d5ba741a6349936c479aa3f900e53faa3372ae7f

    此时分支应该已经恢复到 stash save 之前的状态

4. 注意

需要重点记住的是 git 会周期性地执行它的垃圾回收程序(gc),它执行之后,使用 git fsck 就不能再看到不可访问对象了。

git stash回退的更多相关文章

  1. git stash 用法

    git stash用于将当前工作区的修改暂存起来,就像堆栈一样,可以随时将某一次缓存的修改再重新应用到当前工作区. 一旦用好了这个命令,会极大提高工作效率.   直接举例说明: 1.准备工作,首先初始 ...

  2. git stash 的一次惊心动魄的误删操作

    git stash 的一次惊心动魄的误删操作 简介:行走在互联网最低端的小熊 问题--源起: 小熊和所有混迹在互联网中的开发一样,公司里面用git来管理项目,由于可能经常有几个问题要开发,要频繁在多分 ...

  3. Git Stash紧急处理问题,需要切分支

    在开发过程中,大家都遇到过bug,并且有些bug是需要紧急修复的. 当开发人员遇到这样的问题时,首先想到的是我新切一个分支,把它修复了,再合并到master上. 当时问题来了,你当前正在开发的分支上面 ...

  4. git stash和git stash pop

    git stash 可用来暂存当前正在进行的工作, 比如想pull 最新代码, 又不想加新commit, 或者另外一种情况,为了fix 一个紧急的bug,  先stash, 使返回到自己上一个comm ...

  5. git stash -u 添加新文件

    git 提交 有新文件执行    git stash -u ------ 如果已经执行git stash,会发现有UNtracked这个单词 说明新文件没有添加进去,此时 执行  git stash ...

  6. 每天一命令 git stash

    git stash  命令是用于保存当前进度的命令.该命令会保存当前工作区的改动.保存的改动是已经跟踪的文件的改动,对于未跟踪的改动stash是不会保存的. git stash 命令常用于分支切换的 ...

  7. git stash提交PR的正确步骤&git squash技术

    1.git stash梳理 1.1git stash的克隆与同步 首先整理下git stash的逻辑是这样 在本地做出了新的修改,提交时显示当前的版本不是最新版本,这时就需要先pull一下自己代码仓库 ...

  8. git merge git pull时候遇到冲突解决办法git stash

    在使用git pull代码时,经常会碰到有冲突的情况,提示如下信息: error: Your local changes to 'c/environ.c' would be overwritten b ...

  9. git stash简介

    原文:http://gitbook.liuhui998.com/4_5.html 一.基本操作 当你正在做一项复杂的工作时, 发现了一个和当前工作不相关但是又很讨厌的bug. 你这时想先修复bug再做 ...

随机推荐

  1. 从几道题目带你深入理解Event Loop_宏队列_微队列

    目录 深入探究JavaScript的Event Loop Event Loop的结构 回调队列(callbacks queue)的分类 Event Loop的执行顺序 通过题目来深入 深入探究Java ...

  2. Pytorch_Part6_正则化

    VisualPytorch beta发布了! 功能概述:通过可视化拖拽网络层方式搭建模型,可选择不同数据集.损失函数.优化器生成可运行pytorch代码 扩展功能:1. 模型搭建支持模块的嵌套:2. ...

  3. Spring Boot 允许跨域设置失败的问题深究

    在公司开发过程中,一个前后端分离的项目遇见了跨域的问题. 前端控制台报错:No 'Access-Control-Allow-Origin' header is present on the reque ...

  4. SwiftUI 简明教程之属性包装器

    本文为 Eul 样章,如果您喜欢,请移步 AppStore/Eul 查看更多内容. Eul 是一款 SwiftUI & Combine 教程 App(iOS.macOS),以文章(文字.图片. ...

  5. DOCKER学习_015:Docker网络补充

    1 Docker容器使用LINK方式互通 在前面的网络实验中,当同一主机的两个Docker容器,使用Bridge网桥互通时,我们必须使用docker inspect Dockerid查找出Docker ...

  6. STM32之HAL库、标准外设库、LL库(STM32 Embedded Software)-(转载)

    STM32 Embedded Software  工作以来一直使用ST的STM32系列芯片,ST为开发者提供了非常方便的开发库.到目前为止,有标准外设库(STD库).HAL库.LL库 三种.前两者都是 ...

  7. python基础之字典、集合

    一.字典(dictionary) 作用:存多个值,key-value存取,取值速度快 定义:key必须是不可变类型,value可以是任意类型 字典是一个无序的,可以修改的,元素呈键值对的形式,以逗号分 ...

  8. Java Bean(Day_05)

    我们一路奋战,不是为了改变世界,而是为了不让世界改变我们. 运行环境 JDK8 + IntelliJ IDEA 2018.3 本文中使用的jar包链接 https://files.cnblogs.co ...

  9. 利用redis未授权访问漏洞(windows版)

    0x00 原理   首先需要知道的是,redis是一种非关系型数据库.它在默认情况下,绑定在0.0.0.0:6379 ,若不采取相关策略,比如添加防火墙限制非信任IP访问,会使得redis服务暴露到公 ...

  10. 一文带你搞懂 RPC 到底是个啥

    RPC(Remote Procedure Call),是一个大家既熟悉又陌生的词,只要涉及到通信,必然需要某种网络协议.我们很可能用过HTTP,那么RPC又和HTTP有什么区别呢?RPC还有什么特点, ...