git stash 的作用、流程与冲突处理思路
·1 分钟
介绍 git stash 以及与 git pull --no-rebase 的差异与适用场景。
git stash
git pull --no-rebase
git 冲突处理
这段时间跟同事一起做开发时,总是碰到分支起冲突,我去请教 AI 时,他给了我这样的一套命令,git stash,git pull,git stash pop,这个 pull 是了解的,但是剩下两个是什么呢?为什么能这样避免冲突呢?于是我就去搜索答案,发现 git stash 可以做三件事情,
- 保存当前修改(tracked 文件)
- 清空工作区
- 让你可以安全切分支 然后这个git stash pop命令是把最近一次 stash 的修改恢复到当前工作区,并且从 stash 列表里删除它。
我们来看看一个完整的使用流程 #
# 开发中
git status
# 临时保存
git stash push -m "WIP: payment module"
# 切分支
git checkout main
# 修 bug
git commit -am "hotfix"
# 切回来
git checkout dev
# 恢复修改
git stash pop
那其实有点好奇这个 stash 是存在哪里的,本质是什么? #
- 存在 .git 目录里
- 实际是一个特殊的 commit
- 存在一个栈结构里
但是这种方法不是建议经常使用,很容易造成忘记这回事,最开始我用的时候没有执行最后一步 git stash pop 时吓了一跳,怎么我自己的修改全部不见了。后面才知道是少执行了一步,这也确实暴露了自己的不足。
此外,除了这个解决冲突的办法,还有一个就是git pull –no-rebase,这个 no-rebase 是拉下来以后用 merge 合并。
这两个方法的不同之处是 stash 是隐藏冲突,在冲突前隐藏起来,但是 no-rebase 是冲突发生时选择 merge 方式合并。冲突依然可能发生,但是在 merge 的过程中解决。且这个 no-rebase 也是需要手动去解决冲突的。