当在我的项目中开发一些需要,会新增文件 / 代码、删除文件 / 代码,这些改变首先存在于工作区,局部改变会增加到暂存区。所有的货色都进入了凌乱的状态,如果这时须要切换到另一个分支或者同步近程分支去做一些其余需要(例如,长期修复线上 bug),就相当麻烦。个别地做法,可能是先 commit 这些中间状态的代码,前期再复原到该分支持续开发,但这样做会额定新增一个无意义的 commit,而且所有的改变都被增加到了 commit 里了,与来到分支时的多种理论状态不相符。幸好,Git 提供了长期储藏的命令git stash
,接下来就具体介绍一下:
命令 git stash
作用:将以后分支中的不想 commit 的改变内容,保留至 stash 堆栈中;后续能够在某个分支上复原出 stash 堆栈中的改变内容。
理论利用
初始化状态
文件 index.js;原先有代码“B0”和“B1”;增加了代码“B3”,并且增加到 staging area;增加了代码“B4”,停留在 working directory:
B0 // local repository
B1 // local repository
B3 // staging area
B4 // working directory
文件 index_copy.js;是新增文件,并且有代码“B0”、“B1”、“B3”、“B4”,都在 working directory:
B0 // working directory
B1 // working directory
B3 // working directory
B4 // working directory
保留以后状态
通过命令git stash
,储藏以后状态:
git stash
通过命令git status
,查看以后状态:
git status
On branch master
Your branch is up to date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
index_copy.js
nothing 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 -a
Saved working directory and index state WIP on master: 1a38246 B1
通过命令git stash list
,能够展现出 stash 堆栈列表中所有的储藏信息:
git stash list
stash@{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 storage
git stash list
stash@{0}: On master: temporary storage
查看 stash 信息
通过命令git stash list
,能够看到每个 stash 的信息;stash list 采纳先进后出的程序,最初 stash 的改变,位于第一位:
git stash list
stash@{0}: On master: storage untrack file and ignored file
stash@{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 -p
diff --git a/index.js b/index.js
index 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.js
index 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 pop
与git 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 apply
、git stash pop
,能够将指定 stash 利用到当前目录。
删除:git stash drop <stash>
、git stash clear
,能够删除指定的 stash,或者革除整个 stash list。