Fork me on GitHub

Git stash用法

背景

在使用Git开发时,开发者在自己的分支上进行开发,由于需要紧急开发一个新的分支,而当前手里的完成的工作还不能合并。
此时,使用git stash命令可以将当前做过的修改从工作区保存到暂存区中。

常用命令

添加改动到stash

git stash [save [--patch] [-k|--[no-]keep-index] [-q|--quiet]
                    [-u|--include-untracked] [-a|--all]
                    [<message>]]

当前在jason分支上,我修改a.php文件,并增加了一个untracked files:
git status

1.如果没有untracked files,即:

git stash

2.如果需要在保存工作进度的时候使用指定的说明,必须使用如下格式:

git stash save "message"

3.使用参数–patch会显示工作区和HEAD的差异,通过对差异文件的编辑决定在进度中
最终要保存的工作区的内容,通过编辑差异文件可以在进度中排除无关内容。

4.使用-k或者–keep-index参数,在保存进度后不会将暂存区重置(默认会将暂存区和工作区强制重置,即命令:–no-keep-index的效果)
5.使用-u|–include-untracked,同时储藏未跟踪文件。不影响被忽略的文件

git stash save -u|--include-untracked

git-stash-save

6.使用-a|–all来储藏所有的改动,包括未跟踪文件。不仅仅把新加入的代码文件放入暂存区,还会把用.gitignore忽略的文件放入暂存区

git stash save -a|--all

查看已经保存的储藏列表

$ git stash list
stash@{0}: On jason: save change msg

删除储藏

如果没有指定是第几个储藏时,默认会删除最近的一次储藏

git stash drop [-q|--quiet] [<stash@{n}>]

删除所有的储藏

git stash clear

误删除储藏恢复

1. git  fsck --lost-found # 查看最近移除的文件
2. git show <commit id>   # 查看dangling commit的id,看看是否是自己想要的
3. git stash apply <commit id> # 执行后即可恢复

查看[某次]储藏修改的内容

若参数[<stash@{n}>]不加,表示查看最后一次的储藏

git stash show [<stash@{n}>]

恢复保存的工作进度

git stash <pop | apply> [--index] [-q|--quiet] [<stash@{n}>]

如果不使用任何参数,恢复最近一次保存的工作进度

git stash pop #会从储藏列表中删除刚刚恢复的暂存
git stash apply #不会从储藏列表中删除刚刚恢复的暂存

如果使用<stash@{n}>参数,则从该<stash@{n}>中恢复保存的内容

git stash pop <stash@{n}> #会从储藏列表中删除该`<stash@{n}>`
git stash apply <stash@{n}> #不会从储藏列表中删除该`<stash@{n}>`

–index除了恢复工作区的文件外,还会恢复暂存区的内容

git stash pop --index
git stash apply --index

使用储藏的内容创建新的分支

不能是已经存在的分支,并切换到创建的新分支,删除掉该储藏

git stash branch <branch-name> [<stash@{n}>]

查看储藏列表的SHA-1值

$ git reflog show refs/stash
60a3985 refs/stash@{0}: On jason: save change msg    

参考资料

1.Git操作

轻轻的我走了,正如我轻轻的来