git stash用法
1. stash当前修改
git stash会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录。
比如下面的中间状态,通过git stash命令推送一个新的储藏,当前的工作目录就干净了。
$ 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 directoryandindex state WIP onmaster: 5002d47 our new homepageHEADisnowat 5002d47 our new homepage $ git statusOn branch masternothingtocommit, 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
2. 重新应用缓存的stash
可以通过git stash pop命令恢复之前缓存的工作目录,输出如下:
$ git status On branch master nothing to commit, working tree clean $ git stash popOn branch masterChanges to be committed: newfile: style.css Changes not staged forcommit: modified: index.html Dropped refs/stash@{0} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)
这个指令将缓存堆栈中的第一个stash删除,并将对应修改应用到当前的工作目录下。
你也可以使用git stash apply命令,将缓存堆栈中的stash多次应用到工作目录中,但并不删除stash拷贝。命令输出如下:
$ git stash applyOn branch master Changes to be committed: new file: style.css Changes not staged for commit: modified: index.html
3. 查看现有stash
可以使用git stash list命令,一个典型的输出如下:
$ 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})。
4. 移除stash
可以使用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。
5. 查看指定stash的diff
可以使用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"/>
6. 从stash创建分支
如果你储藏了一些工作,暂时不去理会,然后继续在你储藏工作的分支上工作,你在重新应用工作时可能会碰到一些问题。如果尝试应用的变更是针对一个你那之后修改过的文件,你会碰到一个归并冲突并且必须去化解它。如果你想用更方便的方法来重新检验你储藏的变更,你可以运行 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)
这是一个很棒的捷径来恢复储藏的工作然后在新的分支上继续当时的工作。
7. 暂存未跟踪或忽略的文件
默认情况下,git stash会缓存下列文件:
- 添加到暂存区的修改(staged changes)
- Git跟踪的但并未添加到暂存区的修改(unstaged changes)
但不会缓存一下文件:
- 在工作目录中新的文件(untracked files)
- 被忽略的文件(ignored files)
git stash命令提供了参数用于缓存上面两种类型的文件。使用-u或者--include-untracked可以stash untracked文件。使用-a或者--all命令可以stash当前目录下的所有修改。
至于git stash的其他命令建议参考Git manual。
场景如下,你正在开发需求1时,突然线上发现了一个bug,需要立即修复。需求1的代码因为不完善,也没经过测试,所以你希望针对需求1所做的修改先暂时隐藏,这样就可以使用 stash功能了。
VCS-->git -->stash
这个时候针对需求1做的修改都会隐藏掉。现在假设你处理bug完毕。需要继续开发需求,现在需要unstash
VCS-->git-->Unstash,选中你刚刚的stash,选中Pop stash。点击pop stash即可。如下图:
但是我这里遇到个问题,屏幕右下角有如下提示:
点击View them,发现是.DS_store 文件,这个我已经在.gitignore中声明忽略该文件了。所以我的localChanges中并没有该文件。
没办法,只有先修改.gitignore,不忽略.DS_store.然后执行git status 能看到两个文件被修改了
然后执行git checkout -- ../.DS_Store 即回滚 .DS_store。然后重新unstash,ok。
然后也需要回滚.gitignore