-
当我将新的变更记录提交为
git commit --amend
后,发现这需要修改云端上的提交记录,也就是 vscode 中会出现这张图 -
于是,我通过
git reset head^
撤销掉刚刚的提交。reset 前:
reset 后:
-
但在撤销的同时,我也丢失了最新的提交记录。不过我并不担心,因为我还有云端上的记录,所以我可以简单的直接将云端上的提交记录合并到当前分支
git merge origin/note-readme
-
需求来了,由于我 reset 后的变更还存储在工作树中,所以此时我不能执行 merge 操作。这个时候,大多数人的想法应该是这样的:
- 先拷贝变更的内容,
- 然后 discard 工作树
- 执行 merge 操作
- 再将刚刚变更的内容拷贝回来
嗯,这是一种解决方法,但这也太麻烦了,我们完全可以通过 stash 简化上面过程:
-
使用 stash 的步骤如下:
-
同样是拷贝变更内容,只不过我们是通过
git add . && git stash save "先拷贝变更内容"
命令进行拷贝! -
然后合并云端分支
git merge origin/note-readme
-
现在,我们就恢复到最开始的时候了!也就是文章开始之前,还没之前
git commit --amend
之前 -
最后, 只需要再将刚刚变更的内容拷贝回来,就可以了。方式时运行
git stash pop
命令。
-
总结上面过程
- 编辑内容
git add . && git commit --amend
- 发现与云端冲突
git reset head^
撤销刚刚的变更(同时撤销了原有的提交)git add . && git stash save "先拷贝变更的工作树中的变更"
git merge origin/note-readme
再将云端的提交合并过来git stash pop
将刚刚拷贝的内容拿出来git add . && git commit -m "新的提交"
重新提交
[!TIP]
git stash pop
命令默认会将藏匿区中最新的内容恢复到当前工作目录中,并从 stash 栈中删除它。但如果恢复的内容和已有内容出现冲突时,则不会自动从 stash 中删除。这个时候,你可以通过git stash drop ${0}
显式删除删除。其中的${0}
可能需要根据情况进行修改。你可以通过git stash list
查看 stash 栈中的所有内容。