如何将feat分支所有变更移至main分支并置为未暂存状态?
实现将feat分支变更移至main分支并设为未暂存状态
需求说明
我有一个名为feat的功能分支,提交链如下:
(feat) HEAD -> c1 -> c2 -> c3
其中c1新增c1.txt,c2新增c2.txt,以此类推。最终要实现的效果是:把feat分支的所有变更(包括跨数月的数十次提交、与main的合并记录)全部移到main分支,且所有变更处于未暂存状态(即git status中显示红色),方便在main分支从头重建这些工作。
现有方法验证
你尝试的命令是可行的:
# 在feat分支执行 git reset main git checkout main
原理是:git reset main会将feat分支的指针回退到main分支的当前提交,但默认使用--mixed模式,保留工作区所有原feat分支的修改;之后切换到main分支,因为当前HEAD与main指向同一个提交,工作区的修改会被保留到main分支下,最终所有变更就处于未暂存状态。
更简洁的替代方法
方法1:直接在main分支导入差异
无需切换到feat分支,直接在main分支执行:
git diff main..feat | git apply -
这个方法直接提取feat相对于main的所有变更差异,然后应用到main分支的工作区,所有变更自动处于未暂存状态,适合分支间差异清晰的场景。
方法2:用合并 squash 后撤销暂存
如果分支有复杂的合并记录,这个方法更可靠:
# 确保当前在main分支 git checkout main # 将feat的所有变更合并到暂存区,但不生成提交 git merge --squash feat # 撤销暂存,将所有变更放回工作区 git reset HEAD
git merge --squash会把feat分支相对于main的所有变更整合到暂存区,之后git reset HEAD会把暂存区的所有内容移回工作区,完美实现需求,且能处理包含合并记录的复杂分支。
内容的提问来源于stack exchange,提问作者Johnny Metz
相关产品推荐
相关产品推荐

