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
2.修改的文件会被带到目标分支。
这里先不追究造成这两种情况的原因。如果不使用 stash,怎么能正确切换到 v1.0.0 分支呢?有两种方式:
1.在 feature/make-bug 使用 commit 提交修改,然后切换到 v1.0.0 修改完 bug 后,再切回 feature/make-bug 继续开发,如果不愿意保留上次的临时 commit 记录,则执行 git reset HEAD^ 来完成 手动将修改的文件文件保存在 git 工作空间之外。 两种都不是好方法,第一种很不灵活,而且还为未完成的工作生成一个 commit。
2.第二种手动复制粘贴更不是好主意。
1.确保文件已经保存,通常 IDE 会自动保存好。 执行 git stash 存储当前修改。
2.切换到 v1.0.0 分支。
3.在 v1.0.0 分支修改 bug,并提交修改。
4.切换回到 feature/make-bug 分支。
5.执行 git stash pop 命令还原存储的修改。
原理上,Git stash 会将代码存储在工程的工作目录 .git/refs/stash 中, 并且并不会被 git push 推送到远程。Git 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 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 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
$ git stash drop 0展示 stash 中的修改
$ 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 的方法。
$ 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 $ git stash clear # 创建但不存储到堆栈 $ git stash create 'sample stash' db37916f9a66853ed780174d305900a757f2cc0b $ git stash list # 空结果实际存储:
git stash store -m "sample stash testing.." "db37916f9a66853ed780174d305900a757f2cc0b"