提交到了错误的Git分支:安全移动提交
这些代码块对应不同情况,不是一个完整脚本。请选择适合仓库的情况,并替换分支名、路径和VERIFIED_COMMIT。中止命令只适用于对应的正在进行的操作,不要执行两种备选方案。
简短答案
提交到错误分支后,先用救援分支保留原提交的引用。用cherry-pick把更改应用到目标分支并检查结果,然后再修正原分支。未共享的末尾提交可能适合reset;共享分支通常使用revert。应用到目标和修正来源是两个独立判断。
示例与前提
这里从一个明确案例开始:main末尾的单个普通提交应属于已有的feature/fix。它不是合并提交,工作区干净。请替换成实际分支名。如果有多个提交、合并或后续工作,先识别准确范围,不要直接复制本例最后的reset。
修改前检查状态
先看状态、当前分支和最近的图。检查文件与补丁,而不只看标题:一个提交可能混合多项任务。将完整ID保存在SCHOOL_MISTAKE,切换后仍能准确识别原提交。修正main之前,确认其他人是否已收到这段历史。
git status --short
git branch --show-current
git log -5 --oneline --decorate
git show --stat HEAD
SCHOOL_MISTAKE=$(git rev-parse HEAD)保留引用或独立检出
救援分支使已提交对象保持可达,但不会复制未提交的编辑。本地更改要通过有意的提交、检查过的stash或外部副本单独保存并验证。stash的-u包含未跟踪文件,但不包含忽略文件。reflog不会自动保存这些未提交内容。
git branch rescue/wrong-branch "$SCHOOL_MISTAKE"
git show --stat rescue/wrong-branch第一种操作
切换到目标分支,cherry-pick保存的ID。由于父提交不同,通常会生成不同ID的新提交。检查补丁并运行项目相关检查。确认目标包含所需更改且原提交仍有救援引用之后,才能考虑从原分支移除它。
git switch feature/fix
git cherry-pick "$SCHOOL_MISTAKE"
git show --stat HEAD有意选择另一种结果
仅在未共享末尾提交的情况下,回到main,确认HEAD仍等于SCHOOL_MISTAKE。工作区干净且救援引用保留时,reset到父提交可从main移除它。hard reset还会替换已跟踪文件。如果main已推进或提交已共享,这段操作不再符合前提。
git switch main
git status --short
git rev-parse HEAD
git reset --hard "${SCHOOL_MISTAKE}^"限制与例外
已共享分支优先用普通revert。它添加反向提交,不删除同事已收到的历史。目标cherry-pick与来源revert要分别审查。若已在其他地方合并,需与协作者协调。本指南不提供自动force push方案。
git switch main
git revert "$SCHOOL_MISTAKE"冲突与清理
cherry-pick可能因冲突暂停。读status,解决相关文件,暂存后继续;选错更改或目标时使用cherry-pick --abort。revert有独立的继续与中止命令。中止只结束当前操作,不是该操作之外编辑的通用备份。
git status
git cherry-pick --abort
git revert --abort验证结果
最终图应显示feature/fix上的目标更改和main上的所选修正。比较两边补丁及每个检出的状态。审查完成前保留rescue/wrong-branch。状态干净不证明应用仍正确,还需要验证受影响的行为。
git log -6 --oneline --decorate --all
git show --stat feature/fix
git status --short常见问题
多个提交时先检查顺序、依赖和范围。reset --soft移动引用并保留索引与文件,但本身不会把提交传送到另一个分支。已经push时从共享历史的revert情况考虑,任何例外的重写都应明确协商。
在FluxGit中审查操作
使用FluxGit的可视历史与差异视图审查操作及相关提交。保留本例中的分支、共享历史和本地文件检查。下载页面列出当前提供的版本及平台。