分享一个 git stash 的实际使用场景。

  1. 当我将新的变更记录提交为 git commit --amend 后,发现这需要修改云端上的提交记录,也就是 vscode 中会出现这张图

  2. 于是,我通过 git reset head^ 撤销掉刚刚的提交。

    reset 前:

    reset 后:

  3. 但在撤销的同时,我也丢失了最新的提交记录。不过我并不担心,因为我还有云端上的记录,所以我可以简单的直接将云端上的提交记录合并到当前分支

    sh 复制代码
    git merge origin/note-readme
  4. 需求来了,由于我 reset 后的变更还存储在工作树中,所以此时我不能执行 merge 操作。这个时候,大多数人的想法应该是这样的:

    1. 先拷贝变更的内容,
    2. 然后 discard 工作树
    3. 执行 merge 操作
    4. 再将刚刚变更的内容拷贝回来

    嗯,这是一种解决方法,但这也太麻烦了,我们完全可以通过 stash 简化上面过程:

  5. 使用 stash 的步骤如下:

    1. 同样是拷贝变更内容,只不过我们是通过 git add . && git stash save "先拷贝变更内容" 命令进行拷贝!

    2. 然后合并云端分支 git merge origin/note-readme

    3. 现在,我们就恢复到最开始的时候了!也就是文章开始之前,还没之前 git commit --amend 之前

    4. 最后, 只需要再将刚刚变更的内容拷贝回来,就可以了。方式时运行 git stash pop 命令。

总结上面过程

  1. 编辑内容
  2. git add . && git commit --amend
  3. 发现与云端冲突
  4. git reset head^ 撤销刚刚的变更(同时撤销了原有的提交)
  5. git add . && git stash save "先拷贝变更的工作树中的变更"
  6. git merge origin/note-readme 再将云端的提交合并过来
  7. git stash pop 将刚刚拷贝的内容拿出来
  8. git add . && git commit -m "新的提交" 重新提交

!TIP

git stash pop 命令默认会将藏匿区中最新的内容恢复到当前工作目录中,并从 stash 栈中删除它。但如果恢复的内容和已有内容出现冲突时,则不会自动从 stash 中删除。这个时候,你可以通过 git stash drop ${0} 显式删除删除。其中的 ${0} 可能需要根据情况进行修改。你可以通过 git stash list 查看 stash 栈中的所有内容。

相关推荐
Draw Stars6 小时前
Git BASH安装教程
开发语言·git·bash
Akiyama_Mio-Kon6 小时前
2026 最新:Dify 本地 Docker 部署完整教程(Windows + Git Bash)
windows·git·docker
福如意如我心意11 小时前
Git Worktree开发指南
git
Patrick_Wilson16 小时前
为什么gitlab的MR会默认有一个merge commit
前端·git·gitlab
是乐乐啊呀16 小时前
版本控制 GIT 和 SVN
git·svn
夜鸣笙笙19 小时前
Git详细安装流程
git
瑞码空间1 天前
git知识点黄金笔记
笔记·git·elasticsearch
----云烟----1 天前
Git 提交忽略某些文件方法
git
切糕师学AI1 天前
如何查看已合并到 master 分支的所有分支?Git 分支清理指南
大数据·git·elasticsearch
DevUp2 天前
一个管「引」,一个管「抄」:Submodule 和 Subtree 到底差在哪
git·前端工程化