如何将Git仓库中的变更拆分到多个关联的工作树(worktree)中
跨Git工作树迁移选中变更的最简方案
前置准备
- 先将工作树根目录的
/worktree路径加入.gitignore,避免工作树目录被识别为未跟踪文件干扰操作
最优方案(无中间提交、全场景支持)
全程不产生冗余提交,同时支持已跟踪文件的部分变更、未跟踪文件、二进制文件场景,仅需4步:
- 在主工作树中选中要迁移的变更:
- 已跟踪文件的部分变更执行
git add -p,交互式勾选需要迁移的代码块 - 要迁移的完整文件/未跟踪文件直接执行
git add <文件名>
- 已跟踪文件的部分变更执行
- 导出暂存区的变更为补丁文件:
git diff --staged --binary > concern001.patch - 清除主工作树中已迁走的变更(其余未选中的变更完全保留):
# 清空暂存区标记 git reset HEAD # 撤销主工作树中已经导出到补丁的变更 git apply -R concern001.patch - 进入目标工作树目录,应用补丁即可完成迁移:
cd worktree/Concern001 git apply ../../concern001.patch
操作完成后可直接删除concern001.patch,无任何残留痕迹。
替代方案(适合习惯用stash的场景)
如果更习惯用stash操作,可规避-p和-u参数不兼容的问题:
- 先将所有需要迁移的未跟踪文件执行
git add <文件名>加入暂存区,将其转为临时跟踪状态 - 执行
git stash push -p -m "Concern001"交互式选择要迁移的变更(此时暂存区的未跟踪文件已经支持被正常选中) - 切到目标工作树执行
git stash apply stash@{0}即可完成迁移
方案优势
- 步骤极简,没有冗余的临时提交、cherry-pick、多次reset操作,出错概率极低
- 覆盖所有使用场景:已跟踪文件部分变更、全量文件变更、未跟踪文件、二进制文件都支持
- 不会影响主工作树剩余的未迁移变更,不需要硬重置导致数据丢失
内容的提问来源于stack exchange,提问作者Kamafeather
相关产品推荐
相关产品推荐

