Git 的 stash 功能,望文生义,便是为了存储代码。假定你正在分支 feature/make-bug
尽情创作,刚修正了一半的代码,你领导忽然告诉你在版别分支 v1.0.0 有个紧急 bug 要你修正。像我刚用 Git 不久的时分,下意识直接切换分支 git checkout v1.0.0
,这么做的话,就会有两种后果:
- 分支切换失败,git 报错。
error: Your local changes to the following files would be overwritten by checkout:
service.py
Please commit your changes or stash them before you switch branches.
Aborting
- 修正的文件会被带到目标分支。
这里先不追究形成这两种状况的原因。假如不运用 stash,怎么能正确切换到 v1.0.0
分支呢?有两种方式:
- 在
feature/make-bug
运用 commit 提交修正,然后切换到v1.0.0
修正完 bug 后,再切回feature/make-bug
继续开发,假如不愿意保存前次的临时 commit 记录,则履行git reset HEAD^
来完结 - 手动将修正的文件文件保存在 git 作业空间之外。
两种都不是好方法,榜首种很不灵敏,并且还为未完结的作业生成一个 commit。第二种手动复制粘贴更不是好主意。
比较于榜首种方法,git stash 能够直接将未提交的修正保存在本地,并允许你做其他的修正,履行其他的 git 操作,比如切到其他分支。当你需求的时分,能够再将 stash 存储过的修正复原。
怎么运用 git stash
关于上例,下面是当你运用 git stash 的履行步骤:
- 确保文件现已保存,一般 IDE 会自动保存好。
- 履行
git stash
存储当时修正。 - 切换到
v1.0.0
分支。 - 在
v1.0.0
分支修正 bug,并提交修正。 - 切换回到
feature/make-bug
分支。 - 履行
git stash pop
指令复原存储的修正。
原理上,Git stash 会将代码存储在工程的作业目录 .git/refs/stash
中, 并且并不会被 git push
推送到长途。
Git stash 是能帮你完好保存好稍后可能用到的代码,并且快速整理作业目录的东西。
怎么创立一个 stash
最简单的指令便是:
$ git stash
Saved working directory and index state WIP on master: 83a38ba Merge branch 'feature/make-bug'
默许状况下,git stash 存储没有 commit 的修正。不会存储未盯梢的文件(刚新建没有被 add 的文件)与 ignored 文件,一般来说是不需求这这种文件的。当你的确需求时,能够经过 git stash
的额外的参数来操控:
-
git stash -u
或者git stash --include-untracked
:表明存储未盯梢的文件。 -
git stash -a
或者git stash --all
:表明存储为盯梢与 ignored 的文件。
检查你的 stash
运用 git stash list
检查现在所有的 stash,stash 是经过仓库(后进先出)的顺序存储的。如下所示:
$ git stash list
stash@{0}: WIP on master: 83a38ba Merge branch 'feature/make-bug'
默许 Git 会为 stash 增加默许描绘,如上, 有 WIP 文本(正在作业并编写的代码)、分支名、commit 号,上一个提交的描绘。但是这供给的信息不太友爱,当有多个 stash 的时分,也难以区分,不利于回忆,这时分你能够运用指令 git stash save <description>
自定义 stash 描绘:
$ git stash save '增加用户删去 dao'
Saved working directory and index state On master: 增加用户删去 dao
$ git stash list
stash@{0}: On master: 增加用户删去 dao
stash@{1}: WIP on master: 83a38ba Merge branch 'feature/make-bug'
康复 stash 改动
你能够运用 git stash apply
与 git stash pop
康复 stash 的存储。直接履行这两个指令,会康复栈顶的的 stash(即 stash@{0}
最后保存的 stash)到作业目录。
两者不同的是,pop 会移除仓库中的 stash,而 apply 不会。
$ git stash pop
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: dao.py
no changes added to commit (use "git add" and/or "git commit -a")
当你需求康复最近的 stash 的时分, 直接 pop
是最便利的。
当然,你能够选择你想康复哪个 stash,经过指定 stash id 来完结, 相同,pop 会移除仓库中的指定 stash,而 apply 不会。
$ git stash pop stash@{2}
# 直接写 id 也能够
$ git stash pop 2
或:
$ git stash apply stash@{1}
# 直接写 id 也能够
$ git stash pop 1
整理 stash
当你不需求 stash 的时分,经过下面的指令来整理:
- git stash clear 整理所有的 stash
- git stash drop <stash_id> 删去指定的 stash
$ git stash drop 0
展现 stash 中的修正
运用 git stash show <stash_id>
来展现修正:
$ git stash show 0
dao.py | 3 +++
1 file changed, 3 insertions(+)
传入 --patch
或者-p
检查更详细的信息:
diff --git a/dao.py b/dao.py
index e69de29..8941b16 100644
--- a/dao.py
+++ b/dao.py
@@ -0,0 +1,3 @@
+def addUser(user):
+ session.insert(user)
+ session.commit()
可见是增加了一个叫 addUser 的方法。
康复 stash 到新的分支
有一个场景,当你想要康复 stash 的时分,原分支上现已做了与你 stash 抵触的修正。这时分 pop stash,就会形成代码抵触,这时分就能够运用 git stash branch <new_branch_name stash_id>
指令来处理,它会创立一个新的分支,并把 stash pop 到新分支上,你能够在新分支上处理抵触与进一步修正:
$ git stash branch feature/modify-dao 0
Switched to a new branch 'feature/modify-dao'
On branch feature/modify-dao
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: dao.py
Dropped refs/stash@{0} (4a09ff22f71b41ea5426f16463e61eb9d491c840)
创立一个 stash 但先不存储
在有些场景下,你可能需求先创立一个 stash,但不想立刻保存到 stash 仓库中。这时分能够运用 git stash create '<desc>'
指令完结,它创立一个 stash,并回来一个引证,在稍后需求存储到仓库的时分,再运用 git stash store -m "<desc in stack>" "<引证id>"
指令。
# 为了便利先整理所有 stash
$ git stash clear
# 创立但不存储到仓库
$ git stash create 'sample stash'
db37916f9a66853ed780174d305900a757f2cc0b
$ git stash list
# 空结果
实践存储:
git stash store -m "sample stash testing.." "db37916f9a66853ed780174d305900a757f2cc0b"
总结
本文介绍了 stash 的应用场景与常用用法,希望能有所帮助。
参阅: opensource.com/article/21/…