前言
有时,当你在项目的某个分支上已经工作一段时间后,所有东西都进入了混乱的状态(暂存的,修改而未暂存的), 而这时你想要切换到另一个分支做一点别的事情。 但此时你不想为当前并未完成一部分的内容而再创建一次提交,同时又不想在切换分支的时候丢失工作内容。 针对这个问题的答案是 git stash
命令。
贮存(stash)会处理工作目录的脏的状态——即跟踪文件的修改与暂存的改动——然后将未完成的修改保存到一个栈
上, 而你可以在任何时候重新应用这些改动(甚至在不同的分支上)。
⛵迁移指南
迁移到git stash push
截至 2017 年 10 月下旬,Git 邮件列表上进行了广泛讨论,该讨论中弃用了git stash save
命令, 代之以现有git stash push
命令。主因是git stash push
引入了贮藏选定的 路径规范 的选项, 而有些东西git stash save
不支持。
1. 贮存Stash
为了尝试stash操作,你需要进入项目修改并暂存一些文件。然后使用git status
查看当前文件状态:
//代码块1
D:\工作\om-client git:[master]
git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: src/utils/mixin.js
modified: src/views/equMag/equipmentNew/components/AddEditEquipment.vue
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: package.json
modified: src/views/equMag/equipmentNew/components/BatchEditEqu.vue
modified: src/views/equMag/equipmentNew/components/EquIpmentTable.vue
modified: src/views/equMag/equipmentNew/components/ExtraProperty.vue
modified: vue.config.js
在切换分支之前,尝试git stash或git stash push
命令来贮藏当前工作
D:\工作\om-client git:[master]
git stash
Saved working directory and index state WIP on master: 43046e82 Merge remote-tracking branch 'origin/master'
完成贮藏命令后,再查看文件状态,发现工作目录是干净的了
D:\工作\om-client git:[master]
git status
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
这时你便可以安心切换到其他分支,如果想要查看当前栈上的stash记录,使用git stash list
查看贮藏列表
D:\工作\om-client git:[master]
git stash list
stash@{0}: WIP on master: 43046e82 Merge remote-tracking branch 'origin/master'
stash@{1}: WIP on master: 43046e82 Merge remote-tracking branch 'origin/master'
可以看到在我使用stash贮藏之前已经有过一条stash记录,如果想要恢复stash贮存的文件到工作区,使用git stash apply
默认恢复到最近一次的stash,如果想要恢复到更久之前的stash记录,如使用git stash apply stash@{0}
.
D:\工作\om-client git:[master]
git stash apply
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: src/utils/mixin.js
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: package.json
modified: src/views/equMag/equipmentNew/components/AddEditEquipment.vue
modified: src/views/equMag/equipmentNew/components/BatchEditEqu.vue
modified: src/views/equMag/equipmentNew/components/EquIpmentTable.vue
modified: src/views/equMag/equipmentNew/components/ExtraProperty.vue
modified: vue.config.js
对比当前代码块和代码块1,可以发现git stash apply
命令虽然恢复了文件,但是却丢失了一个文件(src/views/equMag/equipmentNew/components/AddEditEquipment.vue
)的commit状态。
如果想要恢复文件的提交状态,使用附加指令--index
来运行git stash apply
。
D:\工作\om-client git:[master]
git stash apply --index
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: src/utils/mixin.js
modified: src/views/equMag/equipmentNew/components/AddEditEquipment.vue
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: package.json
modified: src/views/equMag/equipmentNew/components/BatchEditEqu.vue
modified: src/views/equMag/equipmentNew/components/EquIpmentTable.vue
modified: src/views/equMag/equipmentNew/components/ExtraProperty.vue
modified: vue.config.js
使用drop
来使用git stash 命令删除stash list中的记录,再次查看stash list,发现删除记录成功。
D:\工作\om-client git:[master]
git stash drop stash@`{0`}
D:\工作\om-client git:[master]
git stash list
stash@{0}: WIP on master: 43046e82 Merge remote-tracking branch 'origin/master'
2. 清理clean
对于工作目录中一些工作或文件,你想做的也许不是贮藏而是移除。 git clean
命令就是用来干这个的。清理工作目录有一些常见的原因,比如说为了移除由合并或外部工具生成的东西, 或是为了运行一个干净的构建而移除之前构建的残留。你需要谨慎地使用这个命令,因为它被设计为从工作目录中移除未被追踪的文件。 如果你改变主意了,你也不一定能找回来那些文件的内容。 一个更安全的选项是运行 git stash --all
来移除每一样东西并存放在栈中。你可以使用 git clean
命令去除冗余文件或者清理工作目录。 使用 git clean -f -d
命令来移除工作目录中所有未追踪的文件以及空的子目录。 -f
意味着“强制(force)”或“确定要移除”,使用它需要 Git 配置变量 clean.requireForce
没有显式设置为 false
。如果只是想要看看它会做什么,可以使用 --dry-run
或 -n
选项来运行命令, 这意味着“做一次演习然后告诉你 将要 移除什么
D:\工作\om-client git:[master]
git clean -d -n
Would remove src/views/system/detail/
Would remove src/views/system/inventory/
默认情况下,git clean
命令只会移除没有忽略的未跟踪文件。 任何与 .gitignore
或其他忽略文件中的模式匹配的文件都不会被移除。
本文由 yuin 创作,
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。