文档章节

教你找回 git stash 数据中的数据

l
 linux-tao
发布于 2017/09/10 16:41
字数 1087
阅读 6
收藏 0
导读 由于不正确的 git 命令,他把保存在 stash 中的更改删除了。在这悲伤的情节之后,我们试图寻找一种恢复他所做工作的方法,而且我们做到了!首先警告一下:当你在实现一个大功能时,请将它分成小块并定期提交。长时间工作而不做提交并不是一个好习惯。下面就演示一下怎样从 stash 中恢复误删的更改。

创建测试分支

我用作示例的仓库中,只有一个源文件 “main.c”,如下所示:

教你找回 git stash 数据中的数据教你找回 git stash 数据中的数据
它只有一次提交,即 “Initial commit”:
教你找回 git stash 数据中的数据教你找回 git stash 数据中的数据

该文件的第一个版本是:

教你找回 git stash 数据中的数据教你找回 git stash 数据中的数据

我将在文件中写一些代码。对于这个例子,我并不需要做什么大的改动,只需要有什么东西放进 stash 中即可,所以我们仅仅增加一行。“git diff” 的输出如下:
教你找回 git stash 数据中的数据教你找回 git stash 数据中的数据

误操作git stash

现在,假设我想从远程仓库中拉取一些新的更改,当时还不打算提交我自己的更改。于是,我决定先 stash 它,等拉取远程仓库中的更改后,再把我的更改恢复应用到主分支上。我执行下面的命令将我的更改移动到 stash 中:

git stash

使用命令"git stash list" 查看 stash,在这里能看到我的更改:

教你找回 git stash 数据中的数据教你找回 git stash 数据中的数据

我的代码已经在一个安全的地方,而且主分支目前是干净的(使用命令 git status检查)。现在我只需要拉取远程仓库的更改,然后把我的更改恢复应用到主分支上,而且我也应该是这么做的。

但是我错误地执行了命令:

git stash drop

它删除了 stash,而不是执行了下面的命令:

stash pop

这条命令会在从栈中删除 stash 之前应用它。如果我再次执行命令

git stash list

,就能看到在没有从栈中将更改恢复到主分支的之前,我就删除了它。OMG!接下来怎么办?

找回git stash 数据

好消息是:git 并没有删除包含了我的更改的对象,它只是移除了对它的引用。为了证明这一点,我使用命令 git fsck,它会验证数据库中对象的连接和有效性。这是我对该仓库执行了 git fsck 之后的输出:
教你找回 git stash 数据中的数据教你找回 git stash 数据中的数据

由于使用了参数 --unreachable,我让 git-fsck 显示出所有不可访问的对象。正如你看到的,它显示并没有不可访问的对象。而当我从 stash 中删除了我的更改之后,再次执行相同的指令,得到了一个不一样的输出:
教你找回 git stash 数据中的数据教你找回 git stash 数据中的数据

现在有三个不可访问对象。那么哪一个才是我的更改呢?实际上,我不知道。我需要通过执行命令 git show 来搜索每一个对象。

教你找回 git stash 数据中的数据教你找回 git stash 数据中的数据

就是它!ID 号 95ccbd927ad4cd413ee2a28014c81454f4ede82c 对应了我的更改。现在我已经找到了丢失的更改,我可以恢复它。其中一种方法是将此 ID 取出来放进一个新的分支,或者直接提交它。如果你得到了你的更改对象的 ID 号,就可以决定以最好的方式,将更改再次恢复应用到主分支上。对于这个例子,我使用 git stash 将更改恢复到我的主分支上。

git stash apply 95ccbd927ad4cd413ee2a28014c81454f4ede82c

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

via: https://opensource.com/article/17/8/recover-dropped-data-stash

作者:Jose Guilherme Vanz 译者:firmianay 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

原文来自:https://linux.cn/article-8819-1.html

本文地址:http://www.linuxprobe.com/find-git-stash-data.html

© 著作权归作者所有

共有 人打赏支持
l
粉丝 15
博文 689
码字总数 777185
作品 0
深圳
运维
git pull 和本地文件冲突问题解决

具体方法如下 git pull origin 分支 //出现错误 git stash 缓存起来 git pull origin 分支 git stash pop //还原 git stash clear 参考资料: http://www.01happy.com/git-resolve-conflicts......

大灰狼wow
2014/09/01
0
4
《Git权威指南》读书笔记 第九章 恢复进度

9.1 恢复保存的进度 查看第五章保存的进度: 恢复进度: 查看工作区状态,进度已经找回了: 对找回进度的工作区做以下处理: (1)对当前的暂存区进行提交: (2)撤销之前的提交,工作区和暂...

一万
2016/07/18
39
0
git常见场景处理

过滤一些不需要的上传的文件或者文件夹 在项目根目录创建.gitignore文件,一行一个过滤规则 本地仓库的版本前进回退 git reset --hard HEAD^ #回退到上一个提交版本 git reset --hard HEAD^...

threefengcjf
2016/10/24
5
0
git使用复习

创建版本库: 使用将这个目录变成git可以管理的仓库 在仓库内新建一个文件 使用把文件添加到仓库 使用 把文件提交到仓库后面输入的是本次提交的说明,可以输入任意内容 修改文件并使用查看当前...

eatnothing
2016/03/20
61
0
Git配置以及命令总结

配置Git 首先在本地创建ssh key;>ssh-keygen -t rsa -C "your_email@youremail.com" 配置使用git仓库的人员姓名 >git config –global user.name “Your Name Comes Here” 配置使用git仓库......

阿泽Aze
2017/12/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

kubeadm部署kubernetes集群

一、环境要求 这里使用RHEL7.5 master、etcd:192.168.10.101,主机名:master node1:192.168.10.103,主机名:node1 node2:192.168.10.104,主机名:node2 所有机子能基于主机名通信,编辑...

人在艹木中
今天
6
0
Shell特殊符号总结以及cut,sort,wc,uniq,tee,tr,split命令

特殊符号总结一 * 任意个任意字符 ? 任意一个字符 # 注释字符 \ 脱义字符 | 管道符 # #号后的备注被忽略[root@centos01 ~]# ls a.txt # 备注 a.txt[root@centos01 ~]# a=1[root@centos01...

野雪球
今天
2
0
OSChina 周二乱弹 —— 程序员圣衣

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文:分享Skeeter Davis的单曲《The End of the World》 《The End of the World》- Skeeter Davis 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
14
0
[ python import module ] 导入模块

import moudle_name ----> import module_name.py ---> import module_name.py文件路径 -----> sys.path (这里进行查找文件) # from app.web import Personimport app.web.Person as Pe......

_______-
昨天
5
0
Redis性能问题排查解决手册

一、性能相关的数据指标 通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息。通过这些信息来分析文章后面提到的一些性能指标。 nfo命令输出的数据可...

IT--小哥
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部