我在当前分支开发了,开发一部分,然后需要在其他分支解决问题,怎么办?
在介绍合并的时候,有提到需要保持分支干净,所以将修改的内容提交后再合并操作。此时如果还不想提交的话,可以使用 git stash
命令将修改的内容保存至 堆栈区,待合适的时候恢复。如果在错误的分支进行了开发,也可以先将内容保存至堆栈区,然后在目标分支恢复内容。
stash 顾名思义就是储藏,在 Git 管理中可以将工作区的内容先存起来,然后合适的时候再拿出来。
学会使用 stash 能很好的辅助我们进行分支的管理和维护,命令也比较简单,主要有以下几个操作。
储存修改的内容
git stash
可以将所有未提交的修改(工作区和暂存区的内容,不包括 untracked 文件或目录) 保存至堆栈区,在需要的时候恢复内容,可以是同分支,也可以是不同的分支。
在 master 分支创建一个名为 stash 1.txt 的文件,然后使用 stash 放入堆栈区
git stash save
- 用法同
git stash
,如果使用git stash
,会产生一条名为" WIP on branchname …"的内容,使用git stash save
可以添加描述信息
创建一个 stash 2.txt,再操作一次,那么 stash 2 这个改动也被放入了堆栈区
默认情况下,git stash
会缓存下列文件:
- 添加到暂存区的修改(staged changes)
- Git 跟踪的但并未添加到暂存区的修改(unstaged changes)
但不会缓存以下文件:
- 在工作目录中新的文件(untracked files)
- 被忽略的文件(ignored files)
git stash
命令提供了参数用于缓存上面两种类型的文件。
- 使用
-u
或者--include-untracked
可以 stash untracked 文件。 - 使用
-a
或者--all
命令可以 stash 当前目录下的所有修改。
完整的 git stash 命令如下,可以根据需求使用(参考文档 https://git-scm.com/docs/git-stash/2.0.0)
git stash [save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all] [
]]
顺便说下,在参数说明中,中括号[] 的内容表示是可选项
查看 stash 栈
git stash list
可以查看 stash 的内容
下面显示的两条,分别是第一次操作 git stash
和第二次操作 git stash save stash 2
产生的两条记录,可以看出,stash 储藏是栈的形式,最新的一条记录在栈顶。
应用 stash
如果想应用 stash 的内容,有两种命令可以实现
git stash pop
git stash pop
命令会恢复之前缓存的工作目录,这个指令将缓存堆栈中的第一个 stash 删除(栈是先进后出)
在 pop 之后 我们最后入栈的改动 stash 2.txt 恢复了,而且 stash 列表也被删除了
pop 后面也可以添加
, git stash pop
来恢复指定的 stash 内容
表示 stash 名称,具体用 stash@{n}
表示。比如stash@{0}
是栈顶(最新的)的内容, stash@{1}
就是更早的,前一个内容。通过 git stash list
也可以查看每个的 stash 编号
git stash apply
后面也可接
,git stash apply
应用某一个stash 内容,不删除记录,默认是应用栈顶(即最新)的一条 stash
为了方便说明,再新建一个 stash 3.txt ,并且 stash
此时将前一个 stash 1.txt 恢复: git stash apply stash@{1}
文件 stash 1.txt 恢复了,并且在stash list
中也没有被删除
(可能有人问,前面恢复的 文件 stash 2.txt 去哪儿了?在进行 stash 3 操作时,stash 2.txt 和 stash 3.txt 都是在暂存区,所以都暂存到第三次 stash 中了)
删除 stash 内容
若某个 stash 内容不会再被应用了,可以使用 git stash drop [
删除,默认为栈顶的 stash
删除掉刚刚恢复的内容 git stash drop stash@{1}
清空 stash 堆栈
git stash clear
会将堆栈所有内容清空
使用 git stash clear
之后,再看下 list, list 中已经没有内容了
查看 stash 的 diff
git stash show [ -p | --patch]
, show 这个命令会显示 stash 的修改内容
当前 添加一个名为 stash.txt 文件,并且在 text.txt 文件追加一行内容 "Line: stash add",将这些修改 stash 一下
-
git stash show
可以查看 stash 的 diff -
git stash show -p
添加-p
或者--patch
可以查看 stash 的全部 diff -
git stash show [ -p | --patch] [
show 后面可以跟] 查看特定 stash 的 diff
创建含有 stash 内容的分支
其实在应用 stash 的过程中,也可能和当前内容产生冲突,比如下面 ===== 上面是应用 stash 之前的内容,下面就是 stash 的内容,此时也是需要解决冲突的(和合并差不多)
<<<<<<< Updated upstream
Line:stash branch
=======
Line: stash add
>>>>>>> Stashed changes
如果 stash 的内容是未完成的内容,此时应用还要先处理冲突再继续完成之前的内容,那么推荐使用 stash 的 branch 命令
git stash branch
这个命令的作用是:会创建一个新的分支,检出(checkout)在储藏工作时的所处的提交,重新应用 stash 内容,如果成功,将会丢弃(drop)该条 stash 的内容。
什么意思呢,看下图:现在在 Commit 2 除,储存了一次修改的内容,然后提交了 C3,之后又 stash 了一次
如果是 git stash branch
那么就是在 C2 处 创建并切换一个分支,并将 Stash 1 的内容带到新的分支中,此时 Stash 1 就会在 list 中删除
上面介绍了 stash 用法,stash 功能在 Git 版本管理中是非常实用的功能,再来复习下 stash 相关命令
git stash
储存修改的内容
git stash save [
储存修改的内容,可以添加描述,如果没有描述 Git 会默认添加,
git stash save -u [
前面可以储存的内容包含暂存区和工作区的内容
- 使用
-u
或者--include-untracked
可以 stash untracked 文件。 - 使用
-a
或者--all
命令可以 stash 当前目录下的所有修改。
git stash list
查看已经 stash 的栈
git stash show
可以查看 stash 的 diff
git stash show -p
添加 -p
或者 --patch
可以查看 stash 的全部 diff
上面命令后面都可以添加
以查看特定 stash 的 diff
git stash pop
应用指定的 stash 内容,并删除 list 中的 stash 记录
git stash apply
应用指定的 stash 内容,不删除 list 中的 stash 记录
git stash drop
删除指定的 stash 内容
git stash clear
清空 stash 栈
git stash branch
在储藏工作时的所处的提交处创建一个新分支并切换,重新应用 stash 内容,完成后,将会丢弃该条 stash 的内容。
以上未明确
时 ,默认为栈顶的 stash
stash 的命令有些多,但其实并不复杂,孰能生巧,会在 Git 管理中起到大的作用的!
系列文章传送门
Git 入门系列(一)- Git 概念/安装/基本操作/远程推送更新
Git 入门系列(二)- 修改管理 / 撤销操作 / 命令及区间关系
Git 入门系列(三)- 分支(上)创建与切换 / 合并 / 查看 / 删除
Git 入门系列(四)- 分支(下)合并解决冲突 / 远程分支
Git 入门系列(五)- stash 贮藏
Git 入门系列(六)- 标签 tag
Git 入门系列(七)- 可视化 Git 管理工具
Git 入门系列(八) - FAQ
欢迎关注个人公众号,【程序媛春哥的手记】