-
Notifications
You must be signed in to change notification settings - Fork 0
Rollback and Recovery
“回退”按钮包含两类完全不同的 Git 操作:
- Revert:新建反向提交,保留历史;
- Reset:移动当前分支,改写本地历史。
不懂该选哪种时,优先选择 Revert。
列表显示当前分支从 HEAD 可达的提交。使用上下键移动时,侧栏提交图同步高亮该节点;此时还没有修改仓库。
| 方式 | 分支是否移动 | 文件结果 | 适用场景 |
|---|---|---|---|
| Revert | 不回到旧节点;新增提交 | 反向应用所选提交 | 已 Push、共享分支、希望保留审计历史 |
| Mixed Reset | 移到目标节点 | 后续内容保留为未暂存更改 | 想重新整理提交和暂存范围 |
| Soft Reset | 移到目标节点 | 后续内容保持已暂存 | 想把多个本地提交重新提交 |
| Hard Reset | 移到目标节点 | 已跟踪文件和暂存区恢复到目标 | 明确要永久丢弃本地历史和改动 |
目标就是当前 HEAD 时只提供 Revert,因为 Reset 到自身没有意义。
Revert 对所选提交生成反向变更并创建一个新提交:
A ─ B ─ C ─ Revert(B)
原来的 B 仍存在,团队成员能看见“发生过什么、后来为何撤销”。执行前工作区必须干净。
Merge commit 有多个父节点,Git 需要知道哪一侧是要保留的主线。TriForge 会再要求选择父节点:
- 第 1 个父节点通常是创建 Merge 时所在的当前分支,界面标为推荐;
- 选择错误主线会反向应用错误的一侧。
不确定时先在 Graph 查看父子关系,或向熟悉该合并的人确认。
示例:
A ─ B ─ C --mixed→ 分支回到 A,B+C 的内容成为未暂存更改
提交 B、C 从当前分支可达历史中移除,但文件内容仍在工作区,适合重新拆分暂存和提交。仍属于历史改写;若 B/C 已 Push,不要轻率使用。
分支回到目标节点,后续提交的合并结果留在暂存区。适合把最近几个尚未共享的提交合成一次新提交。
执行后先看“已暂存 Diff”,再提交。
Hard Reset 会:
- 移动当前分支;
- 重置暂存区;
- 恢复已跟踪工作区文件;
- 丢弃目标节点之后当前分支可达的本地历史。
TriForge 会显示额外模态警告,并在确认后再次验证工作区指纹;确认期间只要内容又变化就取消操作。
未跟踪文件通常不会被 git reset --hard 删除,但不要把这当成备份。TriForge 不承诺能恢复被 Hard Reset 丢弃的内容。
已共享历史优先 Revert。Reset 后本地分支和远端分叉,普通 Push 会被拒绝;0.5.0 同步推送不会自动 Force Push。
如团队确实决定改写远端历史,应在明确沟通、备份和分支保护政策允许的前提下,使用受审计流程处理,而不是为了“让按钮成功”盲目强推。
这不是提交级回退。它只把已跟踪文件的未暂存部分恢复到暂存区/HEAD 对应内容:
- 已暂存部分保留;
- 未暂存部分可能永久丢失;
- 未跟踪文件不会自动删除;
- 执行前必须确认;
- 确认期间文件内容或状态变化会取消。
先打开该阶段 Diff,再决定是否放弃。
TriForge 能识别 Merge、Rebase、Cherry-pick、Revert 的进行中状态,并显示继续/取消入口。
- 打开冲突文件;
- 选择或编辑最终内容,删除冲突标记;
- 暂存所有已解决文件;
- 点击“继续”;
- Git 若仍检测到冲突,会保留状态并再次提示。
点击“取消操作”后还会要求确认。TriForge 重新检测进行中的操作类型,确认状态没有在等待期间变化,再调用相应 abort 命令恢复到操作开始前。
TriForge 0.5.0 没有 reflog 恢复向导。如果刚误删分支或执行了错误 Reset:
- 立即停止新的清理、提交和仓库维护操作;
- 不要运行
git gc; - 在受信终端执行
git reflog查找原提交; - 用找到的完整哈希创建救援分支;
- 确认内容后再决定合并方式。
示例:
git reflog
git branch rescue/<name> <commit-hash>如果不熟悉 reflog,请先复制整个仓库目录作为只读备份,再寻求有经验的人协助。
提交已经 Push 或与别人共享?
├─ 是 → Revert
└─ 否 → 是否只想重新组织提交?
├─ 内容保留为未暂存 → Mixed
├─ 内容保留为已暂存 → Soft
└─ 明确永久丢弃 → Hard(再次确认)
当前文档对应 TriForge Git 0.5.1。