未提交当前分支变更时如何切换Git分支且不转移变更
解决Git分支切换时保留未提交变更的问题
别担心,你要的需求完全能实现!我先给你说最稳妥的标准操作,再解释你之前操作出问题的原因,还有个进阶方案供你选择:
一、用git stash的正确流程(最常用)
其实你选git stash的思路没问题,只是操作环节可能有小疏漏,按下面的步骤来就不会出错:
- 确保你当前在feature分支上,执行命令保存未提交的变更:
加git stash push -m "临时存feature的未提交修改"-m是给这次存的变更加个备注,之后找起来更方便,不加也能正常用。 - 这时候你的feature分支就变成干净状态了,切换到master分支:
现在master分支就是完全干净的,放心基于它创建新的feature分支就行:git checkout master # 要是你的Git版本在2.23以上,也可以用更直观的git switch mastergit checkout -b new-feature-branch - 等你要回到原来的feature分支继续开发时,切回去再恢复之前存的变更:
要是你想保留stash里的记录(怕之后还要用),可以换成git checkout feature git stash popgit stash apply,两者的区别就是pop会把stash记录删掉,apply会保留。
为啥你之前会出现变更转移?
大概率是你在git stash pop恢复变更后,没留在feature分支上操作,直接切去master了——Git的工作区是全局共享的,未提交的变更会跟着你切换分支走。所以只要恢复变更后老老实实待在feature分支上干活,就不会出现变更跑到master的情况。
二、进阶方案:用git worktree隔离工作区
如果你经常需要在多个分支间跳来跳去,不想频繁stash,推荐用git worktree给每个分支单独弄个工作目录,这样变更完全隔离,互不影响:
- 在当前仓库的外面(或者仓库里的子文件夹)创建一个关联master分支的新工作区:
git worktree add ../master-workspace master - 进入这个新目录,里面就是干净的master分支环境,直接创建新分支就行:
cd ../master-workspace git checkout -b new-feature-branch - 原来的仓库目录还是保留着feature分支的未提交变更,两边完全独立,想怎么操作都不怕。
- 之后要是不需要这个工作区了,直接删掉就行:
git worktree remove ../master-workspace
三、小技巧:管理多个stash记录
如果存了好几个stash,怕搞混的话,可以用git stash list查看所有保存的记录,然后用git stash apply stash@{n}(n是记录的序号,比如stash@{0}是最新的)来恢复指定的变更,避免恢复错内容。
内容的提问来源于stack exchange,提问作者Leff
相关产品推荐
相关产品推荐

