Git-stash产生的冲突

场景简介

环境:Windows 10,Git 2.45.1,分支 dev 操作:在干净工作区上执行 git stash pop,试图恢复之前保存的改动。

问题现象

git stash pop 之后,文件 app/Services/Demo.php出现冲突,git status 显示为:

sql 复制代码
Unmerged paths:
       both modified: app/Services/Demo.php

在 SourceTree 中,这个文件同时出现在「已暂存」和「未暂存」区域。 尝试用 git restore 放弃修改,报错:

lua 复制代码
error: path 'xxx' is unmerged

原因分析:什么是 Unmerged paths?

git stash pop 本质是一次 三方合并(当前 HEAD + 当前工作区 + stash 内容)。 合并时这个文件发生冲突,Git 在索引中为它保存了多份版本(base/ours/theirs),标记为 未合并(unmerged)。 在这种状态下,很多命令(包括 git restore)会拒绝操作,防止破坏合并过程,所以会提示 path 'xxx' is unmerged。

最终解决方案

需求:完全放弃这次 stash pop 带来的所有改动,恢复到 pop 前的干净状态,且确认没有其他需要保留的本地修改。执行步骤:

perl 复制代码
# 1. 丢弃所有本地未提交修改(包括冲突)
git reset --hard HEAD
# 2. 确认工作区干净
git status  # 显示 working tree clean
# 3. 同步远程最新提交
git pull

结果:

冲突文件恢复为 HEAD 版本,不再是 Unmerged paths。 工作区与暂存区都干净,只多了远程新拉下来的正常变更。 这次 stash pop 的所有本地影响被彻底清除。

经验总结

stash pop 会触发合并冲突,出现 Unmerged paths 非常正常。 看到 Unmerged paths 时,要意识到:当前还处在一次「未完成的合并过程」。 如果确认当前所有未提交改动都可以丢弃,一键回到干净状态的最简单办法就是: git reset --hard HEAD 操作前务必用 git status / git diff 确认:真的没有其他想保留的本地修改。

清理掉贮藏区 git stash clear

相关推荐
BingoGo16 小时前
PHP clone 之后,为什么改副本会影响原对象?
后端·php
JaguarJack16 小时前
PHP clone 之后,为什么改副本会影响原对象?
后端·php·服务端
小灰灰搞电子17 小时前
Rust+Slint 实现动态消息提示框源码分享
开发语言·后端·rust
小奏技术17 小时前
10 MB 的 Postman 替代品,启动不到 1 秒
后端
东风破_17 小时前
Text2SQL :用自然语言操作 SQLite 数据库
人工智能·后端
IT_陈寒21 小时前
Python的多线程就是个假把式,我算是体验到了
前端·人工智能·后端
码事漫谈21 小时前
如果 AI 要圈养人类,它可能不需要笼子
后端
newerp1 天前
Golang 调度循环:Go runtime 如何永不停歇地找人干活
后端·程序员·go
明月_清风1 天前
AI 时代,为什么架构师又开始谈"本体论"?
人工智能·后端·agent