今天在看一个bug,以前一个分支的版本是正常的,在新的分支上上加了不少日志没找到缘由,但愿回溯到以前的版本,肯定下从哪一个提交引入的问题,可是还不想把如今的修改提交,也不但愿在Git上看到当前修改的版本(带有大量日志和调试信息)。所以呢,查查Git有没有提供相似功能,就找到了git stash
的命令。css
综合下网上的介绍和资料,git stash
(git储藏)可用于如下情形:html
git stash
。commit
提交到本地仓库,而后切换分支去修改bug,改好以后再切换回来。这样的话每每log上会有大量没必要要的记录。其实若是咱们不想提交完成一半或者不完善的代码,可是却不得不去修改一个紧急Bug,那么使用git stash
就能够将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工做区间和上一次提交的内容是彻底同样的,因此你能够放心的修Bug,等到修完Bug,提交到服务器上后,再使用git stash apply
将之前一半的工做应用回来。git stash
命令。储藏(stash)能够获取你工做目录的中间状态——也就是你修改过的被追踪的文件和暂存的变动——并将它保存到一个未完结变动的堆栈中,随时能够从新应用。git stash
用法git stash
会把全部未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工做目录。
好比下面的中间状态,经过git stash
命令推送一个新的储藏,当前的工做目录就干净了。git
$ git status On branch master Changes to be committed: new file: style.css Changes not staged for commit: modified: index.html $ git stash Saved working directory and index state WIP on master: 5002d47 our new homepage HEAD is now at 5002d47 our new homepage $ git status On branch master nothing to commit, working tree clean
须要说明一点,stash是本地的,不会经过git push
命令上传到git server上。
实际应用中推荐给每一个stash加一个message,用于记录版本,使用git stash save
取代git stash
命令。示例以下:缓存
$ git stash save "test-cmd-stash" Saved working directory and index state On autoswitch: test-cmd-stash HEAD 如今位于 296e8d4 remove unnecessary postion reset in onResume function $ git stash list stash@{0}: On autoswitch: test-cmd-stash
能够经过git stash pop
命令恢复以前缓存的工做目录,输出以下:服务器
$ git status On branch master nothing to commit, working tree clean $ git stash pop On branch master Changes to be committed: new file: style.css Changes not staged for commit: modified: index.html Dropped refs/stash@{0} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)
这个指令将缓存堆栈中的第一个stash删除,并将对应修改应用到当前的工做目录下。
你也可使用git stash apply
命令,将缓存堆栈中的stash屡次应用到工做目录中,但并不删除stash拷贝。命令输出以下:app
$ git stash apply On branch master Changes to be committed: new file: style.css Changes not staged for commit: modified: index.html
可使用git stash list
命令,一个典型的输出以下:post
$ git stash list stash@{0}: WIP on master: 049d078 added the index file stash@{1}: WIP on master: c264051 Revert "added file_size" stash@{2}: WIP on master: 21d80a5 added number to log
在使用git stash apply
命令时能够经过名字指定使用哪一个stash,默认使用最近的stash(即stash@{0})。spa
可使用git stash drop
命令,后面能够跟着stash名字。下面是一个示例:调试
$ git stash list stash@{0}: WIP on master: 049d078 added the index file stash@{1}: WIP on master: c264051 Revert "added file_size" stash@{2}: WIP on master: 21d80a5 added number to log $ git stash drop stash@{0} Dropped stash@{0} (364e91f3f268f0900bc3ee613f9f733e82aaed43)
或者使用git stash clear
命令,删除全部缓存的stash。日志
可使用git stash show
命令,后面能够跟着stash名字。示例以下:
$ git stash show index.html | 1 + style.css | 3 +++ 2 files changed, 4 insertions(+)
在该命令后面添加-p
或--patch
能够查看特定stash的所有diff,以下:
$ git stash show -p diff --git a/style.css b/style.css new file mode 100644 index 0000000..d92368b --- /dev/null +++ b/style.css @@ -0,0 +1,3 @@ +* { + text-decoration: blink; +} diff --git a/index.html b/index.html index 9daeafb..ebdcbd2 100644 --- a/index.html +++ b/index.html @@ -1 +1,2 @@ +<link rel="stylesheet" href="style.css"/>
若是你储藏了一些工做,暂时不去理会,而后继续在你储藏工做的分支上工做,你在从新应用工做时可能会碰到一些问题。若是尝试应用的变动是针对一个你那以后修改过的文件,你会碰到一个归并冲突而且必须去化解它。若是你想用更方便的方法来从新检验你储藏的变动,你能够运行 git stash branch,这会建立一个新的分支,检出你储藏工做时的所处的提交,从新应用你的工做,若是成功,将会丢弃储藏。
$ git stash branch testchanges Switched to a new branch "testchanges" # On branch testchanges # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: index.html # # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # # modified: lib/simplegit.rb # Dropped refs/stash@{0} (f0dfc4d5dc332d1cee34a634182e168c4efc3359)
这是一个很棒的捷径来恢复储藏的工做而后在新的分支上继续当时的工做。
默认状况下,git stash
会缓存下列文件:
但不会缓存一下文件:
git stash
命令提供了参数用于缓存上面两种类型的文件。使用-u
或者--include-untracked
能够stash untracked文件。使用-a
或者--all
命令能够stash当前目录下的全部修改。
至于git stash
的其余命令建议参考Git manual。