Git工作区储藏兼谈分支管理中的一个小问题
2018-01-03 09:41
239 查看
这是一篇计划之外的文章,之所以有这篇文章,是因为有一个小伙伴在阅读Git分支管理一文时遇到了一个问题,而这个问题又比较典型,因此我想专门来谈谈Git中工作区的储藏问题。
本文是Git系列的第六篇,了解前面的文章有助于更好的理解本文:
1.Git概述
2.Git基本操作
3.Git中的各种后悔药
4.Git分支管理
5.Git关联远程仓库
现在有一个master分支,master分支中有一个文件叫01.txt,该文件中只有一行数据,然后对01.txt执行add和commit,然后再从master分支中创建出一个新的分支fa,切换到fa分支上,然后向01.txt中再添加一行数据,添加成功之后,不做任何事情,再切换回master分支,此时用cat命令查看01.txt文件,发现竟然有两行数据,按理说master中的01.txt只有一行数据,而fa中的01.txt有两行数据,整个过程如下图:
要搞清楚这个问题,得先明白下面这个问题:
cat命令和git无关,就是用来查看文件的,我为了演示方便使用了cat命令,这和直接用记事本打开文件查看效果是一样的。
可能眼尖的小伙伴已经发现端倪了,我们上面这个操作少了两个步骤,那就是add/commit,fa分支中的数据修改之后直接切换回了master,而没有add/commit。正常情况下(修改数据后add/commit),如果master和fa分支中的数据不一致,我们执行了
解决这个问题,我们有两种方案,请小伙伴们往下看。
当我在一个分支fa中修改了文件,但是还没有完全改好,此时我并不想add/commit,但是这个时候有一个更急迫的事情在另外一个分支fb上需要我去做,我必须要切换分支。
在这样一个场景中,如果我直接切换分支,会出现如下两个问题:
1.从fa切换到fb之后,工作区的代码还是fa的代码,不符合我的工作要求。
2.假设我不在乎问题1,在fb中直接修改工作区的代码,等我在fb中修改完后提交后再回到fa,会发现我之前的代码丢失了。
为了解决这个问题,Git给我们提供了储藏(Stashing)。
现在假设一开始master和fa分支中的文件内容都是一致的,而且两个分支的工作区都是干净的,即没有东西需要add/commit,此时,我在master中修改了文件,修改完成之后,执行
OK,执行完
上面这个命令执行完之后,master分支中的工作区中的文件就恢复了,此时执行
我们也可将工作区储藏多次,这个时候我们可以执行如下命令来查看储藏:
执行效果如下:
还有一些其他的关于储藏的命令:
执行效果和
最后一个参数是指储藏的名字。
Ok,储藏问题我们先说这么多。有问题欢迎留言讨论。
参考资料:
1.《GitHub入门与实践》
2.《Pro Git》
更多JavaEE和Git资料请关注公众号:
本文是Git系列的第六篇,了解前面的文章有助于更好的理解本文:
1.Git概述
2.Git基本操作
3.Git中的各种后悔药
4.Git分支管理
5.Git关联远程仓库
问题回顾
小伙伴遇到的问题是这样的:现在有一个master分支,master分支中有一个文件叫01.txt,该文件中只有一行数据,然后对01.txt执行add和commit,然后再从master分支中创建出一个新的分支fa,切换到fa分支上,然后向01.txt中再添加一行数据,添加成功之后,不做任何事情,再切换回master分支,此时用cat命令查看01.txt文件,发现竟然有两行数据,按理说master中的01.txt只有一行数据,而fa中的01.txt有两行数据,整个过程如下图:
要搞清楚这个问题,得先明白下面这个问题:
cat命令和git无关,就是用来查看文件的,我为了演示方便使用了cat命令,这和直接用记事本打开文件查看效果是一样的。
可能眼尖的小伙伴已经发现端倪了,我们上面这个操作少了两个步骤,那就是add/commit,fa分支中的数据修改之后直接切换回了master,而没有add/commit。正常情况下(修改数据后add/commit),如果master和fa分支中的数据不一致,我们执行了
git checkout -进行分支的切换,这个时候工作区中的文件内容也是会跟着变化的(大家可以通过cat命令或者直接在记事本中打开工作区的文件来查看这种变化),但是如果我在fa分支中修改了文件却没有add/commit就切换回master,此时如果工作区的文件变化了,可能会导致我在fa分支中的修改丢失,因此,这个时候工作区的文件就没有变化,即工作区的文件内容还是fa分支中修改的内容。
解决这个问题,我们有两种方案,请小伙伴们往下看。
解决方案
方案一
第一种解决方案就是在某一个分支修改文件之后,先add并且commit之后再去切换分支,这个操作就比较简单了,我这里就不再演示了。方案二(储藏)
第二种解决方案就是储藏(Stashing),储藏适用在如下场景中:当我在一个分支fa中修改了文件,但是还没有完全改好,此时我并不想add/commit,但是这个时候有一个更急迫的事情在另外一个分支fb上需要我去做,我必须要切换分支。
在这样一个场景中,如果我直接切换分支,会出现如下两个问题:
1.从fa切换到fb之后,工作区的代码还是fa的代码,不符合我的工作要求。
2.假设我不在乎问题1,在fb中直接修改工作区的代码,等我在fb中修改完后提交后再回到fa,会发现我之前的代码丢失了。
为了解决这个问题,Git给我们提供了储藏(Stashing)。
现在假设一开始master和fa分支中的文件内容都是一致的,而且两个分支的工作区都是干净的,即没有东西需要add/commit,此时,我在master中修改了文件,修改完成之后,执行
git status命令我们看到master中有东西需要add/commit,此时我想切换到fa分支中去,但是并不想对master分支执行add/commit,这个时候我们可以执行如下命令,先将当前分支中的文件储藏起来:
$ git stash
OK,执行完
git stash命令之后,再执行
git status,我们发现此时master分支已经是干净的了,此时我们可以愉快的切换到fa分支中去了,切换到fa分支之后,我们发现master中的修改并没有干扰到fa分支,当我们完成了fa分支中的工作之后,再回到master分支,此时执行如下命令可以恢复刚刚储藏的数据:
$ git stash apply
上面这个命令执行完之后,master分支中的工作区中的文件就恢复了,此时执行
git status就可以看到又有数据需要add/commit了。
我们也可将工作区储藏多次,这个时候我们可以执行如下命令来查看储藏:
$ git stash list
执行效果如下:
git stash apply表示恢复最近一次储藏,如果我们想恢复到之前的某一次储藏,可以加上储藏的名字,如下:
$ git stash apply stash@{1}
还有一些其他的关于储藏的命令:
1.恢复储藏并出栈
$ git stash pop
执行效果和
git stash apply一样,不同的是,这里执行完之后,会将栈顶的储藏移除。
2.删除某一个储藏
$ git stash drop stash@{4}
最后一个参数是指储藏的名字。
Ok,储藏问题我们先说这么多。有问题欢迎留言讨论。
参考资料:
1.《GitHub入门与实践》
2.《Pro Git》
更多JavaEE和Git资料请关注公众号:
相关文章推荐
- Git具体问题:如何安全的push文件到工作分支
- 【代码管理】GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git分支 标签 过滤 Git版本工作流
- 【代码管理】GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git分支 标签 过滤 Git版本工作流
- 【代码管理】GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git分支 标签 过滤 Git版本工作流
- [git] git 分支管理和工作流程
- Git 分支---3.3分支的管理---3.4利用分支进行开发的工作流程
- 【代码管理】GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git分支 标签 过滤 Git版本工作流
- 使用jenkins进行git多分支项目打包时的一个小问题
- Git 问题, 一个 master, 多个新功能分支, 怎样有序地合并和提交?
- git干货系列:(五)多人协同工作之分支管理
- Git工作区,暂存区,远程仓库及分支管理
- Git用法之分支管理和分支开发工作流
- git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0
- 【代码管理】GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git分支 标签 过滤 Git版本工作流
- 【Git之窗】(五)Git分支管理的一个实例
- 删除git本地分支遇到的一个小问题
- Git 问题,一个 master,多个新功能分支,怎样有序地合并和提交
- Git 分支 - 分支的新建与合并 分支的新建与合并 让我们来看一个简单的分支新建与分支合并的例子,实际工作中你可能会用到类似的工作流。 你将经历如下步骤: 开发某个网站。 为实现某个新的需求,创
- git的分支管理
- Git 分支管理