能否推送WIP分支同时本地保留未提交更改?附现有工作流
嘿,你的需求我太懂了——既要在本地保留未提交的更改,方便用Xcode查看和切换这些修改,又要推一个WIP分支给同事评审。你想的那个反复删分支、cherry-pick的工作流确实有点折腾,其实有几个更简洁的方案,尤其是第一个,几乎零成本:
最优方案:直接切换分支提交,切回后自动保留未提交更改
这应该是最省事的操作,完全不需要额外的stash或者脚本:
- 假设你当前在日常开发的分支(比如
dev),工作区全是未提交的更改(Xcode里能正常查看) - 创建并切换到WIP分支:
git checkout -b wip/my-feature - 把所有更改提交到这个WIP分支:
git add . && git commit -m "WIP: 开发进度待评审" - 推送到远程仓库:
git push origin wip/my-feature - 切回原来的开发分支:
git checkout dev
这时候你会发现,dev分支的工作区依然保留着那些未提交的更改!原理很简单:git在切换分支时,如果工作区的修改和目标分支没有冲突,就会保留这些修改。因为WIP分支是从dev分支创建的,初始状态和dev完全一致,你在WIP分支提交了更改后切回dev,git会自动把WIP分支里的提交内容还原成dev分支的未提交更改,完美符合你的需求。
如果之后你更新了本地的未提交内容,想要同步到远程WIP分支,只需要重复这几步:
- 切换到WIP分支:
git checkout wip/my-feature - 提交更新(可以用 amend 覆盖之前的WIP提交,保持分支干净):
git add . && git commit --amend --no-edit - 强制推送到远程:
git push origin wip/my-feature --force(WIP分支本来就是临时的,提前和评审同事打个招呼就行) - 切回
dev分支,工作区又回到未提交状态。
备选方案:用git stash暂存+独立WIP分支
如果上面的操作因为某些冲突(比如你之前在dev分支有其他未处理的内容)无法执行,可以用stash来兜底:
- 在
dev分支暂存当前更改:git stash push -m "WIP temp save" - 创建并切换到WIP分支:
git checkout -b wip/my-feature - 恢复暂存的更改并提交:
git stash apply && git add . && git commit -m "WIP: 待评审版本" - 推送WIP分支:
git push origin wip/my-feature - 切回
dev分支,再次恢复暂存的更改:git stash apply
这样也能达到同样的效果,只是多了两步stash操作。
进阶方案:用git worktree创建独立工作区
如果需要长期维护WIP分支,不想来回切换分支,可以用worktree创建一个独立的工作目录:
- 在项目目录外创建一个关联WIP分支的工作区:
git worktree add ../wip-my-feature wip/my-feature(如果还没创建WIP分支,先执行git branch wip/my-feature) - 进入新工作区:
cd ../wip-my-feature - 把主工作区的未提交更改复制过来:可以用
git diff生成补丁在新工作区应用,或者直接在主工作区stash后,在新工作区git stash apply,然后提交推送 - 回到主工作区,继续保留未提交的更改开发
这个方案的好处是两个工作区完全独立,你可以在主工作区正常开发,同时在WIP工作区随时更新提交,互不干扰。
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

