分享一个 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 栈中的所有内容。

相关推荐
何中应21 小时前
使用SSH地址拉取远程仓库代码报下面的错误
git
何中应21 小时前
Git本地仓库命令补充
git
sun0077001 天前
执行repo sync -c -d -j4以后,提交未git push的代码看不到了。要怎么恢复?
git
胖虎11 天前
Git 一个本地仓库同时推送到两个远程仓库(详细教程)
git·多远程仓库·双远程仓库·git双远程·git备份
春日见1 天前
如何创建一个PR
运维·开发语言·windows·git·docker·容器
stevenzqzq2 天前
git 常用操作
大数据·git
Curvatureflight2 天前
Git工作流最佳实践:从混乱到优雅
git
wu~9702 天前
GitHub永不遗忘,使用git push -f来覆盖的提交依旧保留
git·github
Vermouth_002 天前
git clone的时候提示access denied
git
qq_437657273 天前
清楚本地的git并重新登录
git