Git 工具 - 贮藏与清理
   笔记    0 comment
Git 工具 - 贮藏与清理
   笔记    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 或其他忽略文件中的模式匹配的文件都不会被移除。

Responses