Git如何将HEAD指向先前提交且不丢失当前提交(无需新建分支)
无额外分支调整提交顺序实现方案
全程不新建分支、不丢弃原有提交A,即可将初始C -> A(HEAD)结构调整为C -> B -> A(HEAD),操作步骤如下:
- 先记录提交A的哈希值,避免后续操作中定位不到原提交:
保存好输出的字符串,下文用git rev-parse HEAD<A-hash>指代该值。 - 软重置到A的父提交C,将A的全部改动保留在暂存区:
执行后HEAD会直接指向C,原提交A的所有文件变更都留在暂存区,因为我们已经记录了A的哈希,原提交不会被Git回收,不存在丢失风险。git reset --soft HEAD~1 - 把暂存区里属于A的改动临时存入贮藏区,得到干净的C提交基准环境:
执行完用git stash push -m "temp save commit A changes"git status检查,会发现工作区、暂存区和C提交的状态完全一致,没有多余改动。 - 创建新提交B:
正常编辑需要纳入B的文件,完成后走常规提交流程即可:
这一步完成后,临时提交结构为git add <需要提交到B的文件路径> git commit -m "提交B的说明信息"C -> B(HEAD)。 - 把A的改动恢复到当前环境,提交到B之上:
先取出之前贮藏的A的内容:
如果执行后提示冲突,按正常冲突解决流程处理、标记冲突已解决即可。确认所有属于A的改动都正确恢复后,直接提交即可:git stash pop
这里的git commit -C <A-hash>-C参数会直接复用原提交A的提交说明,不需要重复编写提交信息。
校验结果
全部操作完成后执行git log --oneline -n 3,可以看到最近3条提交从上到下依次为A、B、C,HEAD指向A,完全符合预期。原提交A的所有内容、提交信息都完整保留,后续要把A变基到分支最新上游提交直接操作即可。
操作提示:如果担心操作失误,可以在最开始给A打一个临时标签做标记,操作完成后删除标签即可,标签不属于额外分支,不会违反操作限制。
内容的提问来源于stack exchange,提问作者hitesh
相关产品推荐
相关产品推荐

