git stash存在丢失风险,真正安全的做法是避免依赖它:可用git checkout -b新建分支、git restore精准还原、git checkout -p交互式切patch,或用git worktree实现多分支并行开发。

Git stash 保存当前修改再切分支,但容易丢变更
很多人用 git stash 临时存起工作区改动,切到其他分支修 bug,再 git stash pop 恢复。问题在于:如果 stash 冲突没处理干净、或者 pop 后忘了 apply 到正确分支,改动就“消失”了——不是真丢了,但很难找回。
真正安全的做法是利用 Git 的工作区隔离能力,不依赖 stash。
-
git checkout -b fix-login origin/main:直接基于远程分支新建本地分支,工作区代码不变,但 HEAD 指向新分支 - 改完提交后,用
git checkout -回到上一个分支,无需 stash 干预 - 如果只是临时改几行调试,甚至不用 commit,切回去时工作区自动还原(前提是没在目标分支做其他修改)
git restore --staged + git checkout -- 配合使用更可控
当你只想保留部分修改、丢弃另一部分,又不想 commit 或 stash,git restore 是比 git reset 更清晰的选择。
批量替换指定目录下所有 Git 仓库的远程地址(remote URL)。 当用户需要将 Git 仓库从一个服务器迁移到另一个服务器时使用。 触发词:git remote 替换、git url 批量修改、git 仓库迁移、更换 git 地址、批量修改 remote url。
-
git restore --staged file.js:把暂存区的file.js退回到工作区(取消 add) -
git restore --worktree file.css:丢弃工作区对file.css的所有修改(相当于git checkout -- file.css,但语义明确) - 组合使用:先
git add想保留的部分 →git restore --staged其余 →git commit,剩下未暂存的修改自然留在工作区,切分支不受影响
checkout -p 在单文件内做精细分支切换
有时你只改了一个文件里的某几行,想临时切过去修另一个分支的同名文件,又怕覆盖当前改动。git checkout -p 能精准应用或丢弃 patch,而不是整文件替换。
-
git checkout -p origin/feature/login:从远程分支中交互式选取要“打过来”的 hunk - 它不会改变当前分支,也不会 touch 工作区其他文件,只作用于你选中的变更块
- 注意:如果当前文件已有未暂存修改,Git 会提示冲突,此时必须先
git restore或git add明确状态,否则命令失败
git worktree 添加并行工作空间,彻底规避切换
最稳的方式其实是绕开“切换”这件事本身。git worktree 允许你在同一仓库下开多个独立工作目录,每个目录绑定不同分支,互不干扰。
-
git worktree add ../fix-bug-123 hotfix/123:在上级目录建新文件夹,检出hotfix/123分支 - 原工作区仍停留在
main,新目录里改代码、commit、push,完全独立 - 删掉时用
git worktree remove ../fix-bug-123,别直接rm -rf,否则 Git 记录残留导致后续报错
worktree 不是玩具功能,大型项目多人协作时,它让“同时维护多个版本”变成常态操作。但要注意:不能在两个 worktree 里同时改同一个 tracked 文件,Git 不锁文件,冲突得靠人发现。










