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. ZwQuerySystemInformation枚举内核模块

    在内核中通过调用此函数来枚举windows系统中已经加载的内核模块. NTSTATUS ZwQuerySystemInformation ( SYSTEM_INFORMATION_CLASS Syst ...

  2. 关于ollydbg的堆栈视图的使用(结合crackme2分析)

    在crackme2中我们通过在弹出的窗口处下段然后逐层往用户区回溯,我们利用不断下断点和反复运行程序回溯,其实可以利用Ollydbg的堆栈视图来完成, ollydbg的堆栈视图反映了程序在运行期间函数 ...

  3. 5.配置IP

    静态IP配置 1.NAT模式设置 首先设置虚拟机中NAT模式的选项,打开VMware,点击"编辑"下的"虚拟网络编辑器",设置NAT参数 注意: VMware ...

  4. 啥?SynchronousQueue和钟点房一个道理

    今天这篇文章,我们继续讲架构师大刘的故事. 大刘有段时间经常会给一些程序员讲课.这一方面是由于团队培训的需要,一方面也是大刘自身想搞搞凡尔赛,嘚瑟一下自身的实力. 大刘讲课是允许公司任何一个人进去听的 ...

  5. 戴尔服务器如何配置远程管理卡(IDRAC9)适用于戴尔R740服务器

    戴尔服务器如何配置远程管理卡(IDRAC9)适用于戴尔R740服务器 转: DELL IDRAC9 该配置方法适合于所有戴尔14G服务器,包括全系列戴尔服务器,标准版适用于R440/R540/R640 ...

  6. C语言风格的 for 循环(SHELL的循环写法 已验证20200517)

    C语言风格的 for 循环 C语言风格的 for 循环的用法如下: for((exp1; exp2; exp3))do    statementsdone 几点说明: exp1.exp2.exp3 是 ...

  7. mysql集群无法启动成功

    场景:两台数据库运行一段时间后发现集群挂了,一台服务正常,一台不正常. 日志如下: [ERROR] InnoDB: Attempted to open a previously opened tabl ...

  8. Linux_yum工具基本概述

    一.什么是yum 1️⃣:yum是yellowdog update manager的简称,它能够实现rpm管理的所有操作,并能够自动解决各rpm包之间的依赖关系. 2️⃣:yum是rpm的前端工具,是 ...

  9. 033.Python的__del__析构方法he__call__方法

    一 __del__ 魔术方法(析构方法) 1.1 介绍 触发时机:当对象被内存回收的时候自动触发[1.页面执行完毕回收所有变量 2.所有对象被del的时候] 功能:对象使用完毕后资源回收 参数:一个s ...

  10. S5 Linux信息显示与搜索文件命令

    5.1-5 uname.hostname.dmesg.stat.du 5.6 date:显示与设置系统时间 5.7 echo:显示一行文本 5.8-12 watch.which.whereis.loc ...