撤销最后一次Git提交:soft reset或revert
这些代码块对应不同情况,不是一个完整脚本。请选择适合仓库的情况,并替换分支名、路径和VERIFIED_COMMIT。中止命令只适用于对应的正在进行的操作,不要执行两种备选方案。
简短答案
撤销本地最后提交但保留更改时,reset --soft把分支移到父提交,保持索引和文件。撤销已共享提交时,revert新增反向提交。先判断是否保留代码及其他人是否已有历史,再选命令。
示例与前提
例子是当前末尾一个有父的普通非merge提交,工作区干净,没有无关暂存文件。首个提交没有HEAD^,merge有多个父;都不符合这个快捷方法。检查图,而不把HEAD~1当成万能撤销按钮。
修改前检查状态
读取补丁、状态和共享情况。去掉提交包装继续写代码、反转已发布代码、完全丢弃,是不同结果。重写发布分支之前协调。时间最近或作者是自己,不证明提交是私有的。
git status --short
git log -3 --oneline --decorate
git show --stat HEAD保留引用或独立检出
在HEAD创建rescue/before-undo保留原已提交状态。未提交文件单独保存,分支不存储它们。干净例子中soft reset只把该补丁放入索引。已有修改的索引可能混合多项任务,需要单独审查。
git branch rescue/before-undo HEAD
SCHOOL_UNDO=$(git rev-parse HEAD)第一种操作
本地保留更改时执行reset --soft HEAD^,再看diff --cached。内容留在索引和工作区,可重新提交。mixed reset对索引的效果不同。不要为缩短暂存状态而切换--hard,因为它也改变工作文件。
git reset --soft HEAD^
git diff --cached
git status --short有意选择另一种结果
已共享普通提交把核实ID记为SCHOOL_UNDO,再revert。新提交反转所选更改,同时保留同事收到的历史。普通push前验证结果和项目检查。merge revert需要选主线父并理解之后合并的影响,应使用专门流程。
git revert "$SCHOOL_UNDO"限制与例外
revert可能与后续工作冲突。读status,解决并暂存,再revert --continue。选错时revert --abort。reset --soft没有相同继续或中止状态。不要混用流程,也不要在未完成revert时启动另一历史修复。
git status
git revert --abort冲突与清理
连已提交代码和本地文件都丢弃是额外破坏性决定,先保存并检查状态。未提交工作不在reflog。restore points已启用且检测到本地更改时,FluxGit可以在支持的hard reset前保存safety stash;这段普通终端不会调用该受保护应用路径。
验证结果
soft reset后将分支末尾和索引补丁与救援引用比较。revert后确认只反转所需行为且保留有用后续工作。运行项目检查,审查期间保留救援分支。Git命令无错完成不证明代码正确。
git log -4 --oneline --decorate
git status --short
git diff --cached常见问题
soft reset不删除文件,保留树和索引,只移动引用。revert不擦除原提交,而是新增逆向更改。reflog针对仍保留的本地引用状态与提交对象,不是任意未保存文件内容的恢复工具。
在FluxGit中审查操作
使用FluxGit的可视历史与差异视图审查操作及相关提交。保留本例中的分支、共享历史和本地文件检查。下载页面列出当前提供的版本及平台。