Skip to content
本页内容

有时,当你在项目的一部分上已经工作一段时间后,所有东西都进入了混乱的状态, 而这时你想要切换到另一个分支做一点别的事情。

问题是,你不想仅仅因为过会儿回到这一点而为做了一半的工作创建一次提交。 针对这个问题的答案是 git stash 命令。

贮藏(stash)会处理工作目录的脏的状态——即跟踪文件的修改与暂存的改动——然后将未完成的修改保存到一个栈上,

而你可以在任何时候重新应用这些改动(甚至在不同的分支上)。

贮藏工作

改动几个文件,然后暂存其中的一个改动

现在想要切换分支,但是还不想要提交之前的工作;所以贮藏修改。 将新的贮藏推送到栈上,运行 git stash 或 git stash push

git stash

暂存已跟踪文件的修改(默认)

bash
git stash

git stash push
  • git stash 默认只会暂存 已经被 Git 跟踪(tracked) 的文件的修改,包括:

    • 已经纳入版本控制的文件的修改(modified)
    • 已经 staged 的修改(暂存区内容)
  • 但是对于 未被跟踪的文件(untracked files) 和 被忽略的文件(ignored files),git stash 默认是不会保存的。

  • 如果你想把未跟踪的文件也一并暂存,可以加参数:

    bash
    git stash -u
    
    git stash --include-untracked
  • 如果连 .gitignore 中忽略的文件也要一并暂存,可以用:

    bash
    git stash -a   # 或 --all
  • 总结:

    • git stash:只暂存已跟踪文件的修改
    • git stash -u:额外包含未跟踪文件
    • git stash -a:包含未跟踪 + 忽略文件

给 stash 添加备注

bash
git stash push -m "修复登录 bug 的临时修改"

执行 git stash之后查看工作目录状态 git status 可以看到是干净的

此时,你可以切换分支并在其他地方工作;你的修改被存储在栈上。

git stash list

查看贮藏的东西

git stash apply

将贮藏的工作重新应用,默认指定的是最近的贮藏

  • git stash apply stash@{2} 应用其中一个更旧的贮藏

  • git stash pop 应用贮藏然后立即从栈上扔掉它

  • git stash pop stash@{0} 应用并删除

git stash drop

丢弃最新的暂存

  • git stash drop <stash_id> 加上将要移除的贮藏的名字来移除它
  • git stash drop stash@{0}
  • git stash clear 清空所有

部分文件 stash

bash
git stash push path/to/file1 path/to/file2