当在我的项目中开发一些需要,会新增文件/代码、删除文件/代码,这些改变首先存在于工作区,局部改变会增加到暂存区。所有的货色都进入了凌乱的状态,如果这时须要切换到另一个分支或者同步近程分支去做一些其余需要(例如,长期修复线上bug),就相当麻烦。个别地做法,可能是先commit这些中间状态的代码,前期再复原到该分支持续开发,但这样做会额定新增一个无意义的commit,而且所有的改变都被增加到了commit里了,与来到分支时的多种理论状态不相符。幸好,Git提供了长期储藏的命令git stash,接下来就具体介绍一下:

命令git stash作用:将以后分支中的不想commit的改变内容,保留至stash堆栈中;后续能够在某个分支上复原出stash堆栈中的改变内容。

理论利用

初始化状态

文件index.js;原先有代码“B0”和“B1”;增加了代码“B3”,并且增加到staging area;增加了代码“B4”,停留在working directory:

B0 // local repositoryB1 // local repositoryB3 // staging areaB4 // working directory

文件index_copy.js;是新增文件,并且有代码“B0”、“B1”、“B3”、“B4”,都在working directory:

B0 // working directoryB1 // working directoryB3 // working directoryB4 // working directory

保留以后状态

通过命令git stash,储藏以后状态:

git stash

通过命令git status,查看以后状态:

git statusOn branch masterYour branch is up to date with 'origin/master'.Untracked files:  (use "git add <file>..." to include in what will be committed)        index_copy.jsnothing added to commit but untracked files present (use "git add" to track)

通过的下面的状态信息能够看出,文件“index_copy.js”未被储藏。

默认状况下,stash只会储藏被Git跟踪的文件的代码批改;不会储藏未被Git跟踪的文件。应用命令git stash -a,能够将所有的文件都储藏,包含未追踪的文件、被git疏忽的文件。

通过命令git stash -a,储藏以后状态下所有的改变:

git stash -aSaved working directory and index state WIP on master: 1a38246 B1

通过命令git stash list,能够展现出stash堆栈列表中所有的储藏信息:

git stash liststash@{0}: WIP on master: 1a38246 B1

通过下面的stash list能够看出,储藏的信息仅蕴含branch name、last commit id、last commit message信息。能够通过命令git stash -a -m <message>,为该条储藏增加正文message:

git stash -a -m "temporary storage"Saved working directory and index state On master: temporary storagegit stash liststash@{0}: On master: temporary storage

查看stash信息

通过命令git stash list,能够看到每个stash的信息;stash list采纳先进后出的程序,最初stash的改变,位于第一位:

git stash liststash@{0}: On master: storage untrack file and ignored filestash@{1}: On master: storage track file

通过命令git stash show,能够查看stash list中最新保留的stash与当前目录的概要差别:

git stash show index.js | 1 + 1 file changed, 1 insertion(+)

通过命令git stash show -p,能够查看stash list中最新保留的stash与当前目录的具体差别:

git stash show -pdiff --git a/index.js b/index.jsindex d6ff485..481c108 100644--- a/index.js+++ b/index.js@@ -1,2 +1,3 @@ B0 B1+B4

通过命令git stash show stash@{n},能够查看stash list中指定序号为n的stash与当前目录的概要差别:

git stash show stash@{1} index.js | 2 ++ 1 file changed, 2 insertions(+)

通过命令git stash show stash@{n} -p,能够查看stash list中指定序号为n的stash与当前目录的具体差别:

git stash show stash@{1}diff --git a/index.js b/index.jsindex d6ff485..f189f43 100644--- a/index.js+++ b/index.js@@ -1,2 +1,4 @@ B0 B1+B2+B3

利用stash存储的内容

stash存储的内容,能够复原到任何分支,不仅仅是保留stash时的分支。

命令git stash apply,将堆栈中栈顶地位的stash的内容利用到当前目录。

命令git stash apply <stash>,将堆栈中指定stash的内容利用到当前目录。

命令git stash popgit stash apply的区别在于:在利用到目录之后,会立刻从stash list中删除stash。

删除stash

命令git stash drop,从stash list中删除堆栈中栈顶地位的stash。

命令git stash drop <stash>,从stash list中删指定stash。

命令git stash clear,将stash list清空。

总结

命令git stash高效地解决了长期存储开发状态的需要。

新增:git stash,只针对Git跟踪的文件;git stash -a,能够储藏所有文件的改变;参数-m <message>,能够为stash增加正文message。

查看:git stash list,查看stash list;git stash show <options> <stash>,能够查看指定stash与当前目录的差别。

利用:git stash applygit stash pop,能够将指定stash利用到当前目录。

删除:git stash drop <stash>git stash clear,能够删除指定的stash,或者革除整个stash list。