git stash

本文详细介绍了如何使用Git Stash保存工作区和暂存区的改动,以及如何恢复这些改动。通过示例展示了在不同git状态下的stash操作,并解释了stash记录的内部结构,包括其多个parent的含义。最后,讨论了如何应用stash内容并继续编码工作。
摘要由CSDN通过智能技术生成

这个命令用来将当前暂存区内容进行保存,然后整个工作区、暂存区、仓库恢复到上次提交的状态。
首先看一下当前git状态:
在这里插入图片描述
当前状态下只有一个README文件;
我们向工作空间加入一些文件或者文件夹,最后的状态如下:
在这里插入图片描述
整个工程目前由main.py空文件、README空文件、first/main.py空文件这几个部分组成。

然后再添加一些内容使得当前git状态如下:
在这里插入图片描述

即将main.py加入追踪后后再写入一行内容但不加入暂存区,新建两个文件test.py和__init__.py,其中test.py中增加一行内容,但均不放入暂存区;
然后执行git stash将内容保存:
在这里插入图片描述
这里有几个地方要注意:
1 执行保存时工作区或者暂存区至少有一处地方与头指针不同,否则提示“No local changes to save”导致失败;
2 可以直接使用git stash,不一定需要有save,但最好用save 然后后边加注释信息,方便stash过多时能区分;
3 默认情况下stash只会暂存已经添加到git的成员文件,为了将所有更改都添加(包括已经被gitignore的文件),需要在最后使用-u,表示所有文件都添加;这里使用了这个参数;

从上面的输出可以看到,当前分支已经很干净,所有内容均已被暂存,而stash记录使用了类似reset一样的reflog格式,所以切换是很方便的。
看一下stash中存储的这个对象的log:
在这里插入图片描述
这个log有点儿奇怪,一般情况下合并分支最多就是两个parent,但这个居然有三个,这三个parent能从下边的commit id上对应;首先045这个parent是stash之前head的commit id,第二个parent 0889b这个是暂存区的commit id,而第三个09ff则是工作区未追踪文件的commit id;而最新的commit则是stash时工作区的状态;
其实可以验证一下;
09ff5c这个commit指向的tree为a5341d,查看这个tree又能得到:
在这里插入图片描述
可以看到test.py中正是写入的’print(‘test’)’,而且这个tree只指向当时仅存在于工作区中的__init__.py和test.py两个文件;
而查看bdbc63这个对象可以看到:
在这里插入图片描述
main.py中的内容正是stash前写入的内容。

(因为测试,上面内容是在某个commit下操作的,然后会切换会master,但整体结论不受影响)。
最后将stash中的内容恢复,继续写代码:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值