应用举例
通过几个实际的示例来了解一下git stash
的强大.
开发到一半,同步远端代码
当你的开发进行到一半,但是代码还不想进行提交 ,然后需要同步去关联远端代码时.如果你本地的代码和远端代码没有冲突时,可以直接通过git pull
解决.但是如果可能发生冲突怎么办.直接git pull
会拒绝覆盖当前的修改.
遇到这种情况,需要先保存本地的代码,进行git pull
,然后再pop出本地代码:
git stash
git pull
git stash pop
工作流被打断,需要先做别的需求
当开发进行到一半需要修改一个线上BUG,当然,你可以开一个新的分支,把当前代码提交过去,回头再merge,具体代码如下
繁琐的工作流示例
# ... hack hack hack ...
git checkout -b my_wip
git commit -a -m "WIP"
git checkout master
edit emergency fix
git commit -a -m "Fix in a hurry"
git checkout my_wip
git reset --soft HEAD^
# ... continue hacking ...
我们可以通过git stash
来简化这个流程
正确姿势
# ... hack hack hack ...
git stash //保存开发到一半的代码
edit emergency fix
git commit -a -m "Fix in a hurry"
git stash pop //将代码追加到最新的提交之后
# ... continue hacking ...
提交特定文件
如果对多个文件做了修改,但是只想提交几个文件,或者想先暂时保存几个修改,测试其他文件的执行结果.可以通过git stash save --keep-index
来进行.
# ... hack hack hack ...
git add --patch foo //只将第一部分加入管理the index
git stash save --keep-index //将其余部分保存起来
edit/build/test first part
git commit -m 'First part' //提交全部的git管理中的代码
git stash pop //继续进行存储代码的工作
# ... repeat above five steps until one commit remains ...
edit/build/test remaining parts
git commit foo -m 'Remaining parts'
恢复被错误clear/drop
的存储
如果因为失误对存储仓库进行了clear
或者drop
操作,在一般机制下是不能恢复的.但是可以通过以下指令来获取仍在仓库中的,但是已经不可获取的存储列表
git fsck --unreachable |
grep commit | cut -d\ -f3 |
xargs git log --merges --no-walk --grep=WIP
git stash 的具体用法
git stash
通过在指令后添加其他的附件选项,实现复杂的定制化操作,下面我们来对具体用法进行讲解.
save, push
-
save [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [<message>]
-
push [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [-m|--message <message>] [--] [<pathspec>…]
save
和push
命令都可以用于存储修改.并且将git
的工作状态切回到HEAD
也就是上一次合法提交上.后面的<message>
是选填项.
如果给定具体的文件路径,git stash
只会处理路径下的文件.其他的文件不会被存储
--keep-index
(简写为-k
)只会存储为加入git
管理的文件
--include-untracked
为追踪的文件也会被缓存,当前的工作空间会被恢复为完全清空的状态.如果不使用--include-untracked
而是用--all
,那么除了未加入管理的文件,被git
忽略(ignore
)的文件也会被缓存.
--patch
命令可以让我们选择当前修改和HEAD
提交diff
部分.
list
list [<options>]
展示当前存储库中的存储单元列表.每个元素包含的信息有索引位置,存储时所在的分支,存储前的提交的描述.举例
stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation
stash@{1}: On master: 9cc0589... Add git-stash
show
show [<stash>]
展示存储单元和最新提交的diff
结果.如果没有给定<stash>
参数时,会对比最新的存储单元.
pop
pop [--index] [-q|--quiet] [<stash>]
移除单个存储单元.和git stash save
的作用相反.