你们好,今天的文章咱们来介绍git当中一个很是经常使用的功能——储藏。git
你们在协同开发的时候应该都有这样的经历,有的时候咱们的功能开发了一半,由于某些缘由咱们想要checkout到其余的分支上查看代码或者是执行某个工做。可是若是咱们直接执行checkout,git会禁止咱们的行为。web
我拿本地的项目举个例子,能够看到当咱们执行了checkout命令以后,git提示咱们在一些文件的改动会被覆盖,因此拒绝了咱们的checkout命令。app
这个时候应该怎么办呢?最好的办法固然是使用git commit把改动提交了。但问题是有的时候咱们不想提交一些代码,好比尚未通过严谨的测试,或者是咱们临时开发的一些测试功能等等。在这种状况下commit也是不合适的,即便提交了了,以后在push以前也会要把commit撤销了。但若是一不当心忘记了,可能就会形成悲剧。编辑器
针对这个问题,git提供了一个解决策略就是stash功能。测试
git stash能够将本地尚未提交的改动所有存储起来。接着,咱们在以前的某一篇文章当中加上一行-test stash。flex
咱们执行一下git diff,能够看到这行改动。url
接着咱们执行git stash,会发现咱们的git目录又回到了没有改动的状态。再执行git diff也看不到任何改动了。spa
这是由于git把咱们本地尚未提交的改动都暂存了起来,这样方便咱们进行checkout或者是其余一些操做,而不会起冲突或者是其余的影响。3d
那么当咱们操做完成以后,想要还原刚才暂存起来的内容,这个时候应该怎么办呢?code
也有办法,咱们只须要使用git stash apply或者是git stash pop这两个命令就能够将刚才暂存起来的内容还原了。可是这里有一个问题,就是stash apply和pop之间是不一样的。
这里涉及到stash内部的实现机制,stash内部实际上是经过堆栈实现的。pop对于堆栈而言很明确,就是弹出的意思。也就是说若是咱们使用的是pop,那么当咱们pop以后,这条记录会在堆栈当中删除。而若是使用的是apply呢,记录不会从堆栈当中删除,仍然会保留下来。
通常状况下我使用pop多一些,可是pop也有缺点,好比pop没有办法选择应用的记录。咱们可使用git stash list来查看一下当前堆栈当中已经有的记录。
若是咱们使用git stash pop的话,默认的是应用的栈顶的记录,也就是stash@{0}。但若是咱们使用stash apply的话,咱们能够自由选择咱们想要应用的记录。好比若是咱们想要应用最后一条记录的话,咱们能够这样:
git stash apply stash@{2}
关于应用储存的修改也有一些细节,首先是储藏和修改对应的分支能够不一样。咱们能够在一个分支储藏,以后切换到另一个分支进行应用。而且若是咱们在应用以前修改了一样的内容的话,也会引发合并冲突。
另外就是当咱们应用储藏的时候,会发现咱们以前add过的文件又从新回到了未暂存的状态。若是咱们想要从新回到文件被暂存的状态时,咱们可使用index选项来执行。
git stash apply --index
对于咱们已经不想要的储藏记录,咱们能够执行git stash drop来进行删除。
除了上述的功能以外,git stash还有一些其余的用法。
好比--keep-index选项,在不加这个选项的时候,当咱们使用git stash,它会把全部没有commit的内容所有stash。可是有的时候咱们不但愿这样,咱们但愿它只暂存咱们没有add到暂存区的内容。这个时候咱们就能够经过这个参数实现。
另一个参数是-u或者是--include-untracked,咱们从这个名字上也看得出来。它们的意思是在stash的时候将新建立而且尚未被git管理的文件也一并储藏起来。
除此以外,还有--patch的功能也很经常使用。patch咱们曾经在上篇文章讲解交互式命令的时候讲到过,它能够将git针对的改动缩小到代码而不是文件级别。交互式地和咱们操做哪些代码层面的改动须要存储起来,操做方法和上篇文章介绍的同样。你们若是有所遗忘能够在文末找到上一篇的文章进行回顾。
最后一个功能是从储藏上新建一个分支,有的时候咱们先储存了代码以后又继续进行了一些工做。这个时候若是咱们再恢复从前的改动则会引发冲突。这个时候咱们能够运行git stash branch新建一个新的分支,在这个分支上应用咱们的提交。
git stash branch applystash
应用成功以后Git会自动抛弃掉对应的stash记录,很是方便,不过我我的没有用过,由于实际工做当中没有遇到这么复杂的状况。
今天的文章就到这里,衷心祝愿你们天天都有所收获。若是还喜欢今天的内容的话,请来一个三连支持吧~(点赞、关注、转发)