Git 工具 - 贮藏与清理 Jun 27 2024 笔记 0 comment ### 前言 有时,当你在项目的某个分支上已经工作一段时间后,所有东西都进入了混乱的状态(暂存的,修改而未暂存的), 而这时你想要切换到另一个分支做一点别的事情。 但此时你不想为当前并未完成一部分的内容而再创建一次提交,同时又不想在切换分支的时候丢失工作内容。 针对这个问题的答案是 `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 创作,本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。