Skip to content

Rollback and Recovery

zhangxh edited this page Aug 16, 2026 · 1 revision

回退、撤销与冲突恢复

“回退”按钮包含两类完全不同的 Git 操作:

  • Revert:新建反向提交,保留历史;
  • Reset:移动当前分支,改写本地历史。

不懂该选哪种时,优先选择 Revert

两步回退流程

第 1 步:选择节点

列表显示当前分支从 HEAD 可达的提交。使用上下键移动时,侧栏提交图同步高亮该节点;此时还没有修改仓库。

第 2 步:选择方式

方式 分支是否移动 文件结果 适用场景
Revert 不回到旧节点;新增提交 反向应用所选提交 已 Push、共享分支、希望保留审计历史
Mixed Reset 移到目标节点 后续内容保留为未暂存更改 想重新整理提交和暂存范围
Soft Reset 移到目标节点 后续内容保持已暂存 想把多个本地提交重新提交
Hard Reset 移到目标节点 已跟踪文件和暂存区恢复到目标 明确要永久丢弃本地历史和改动

目标就是当前 HEAD 时只提供 Revert,因为 Reset 到自身没有意义。

Revert:推荐的安全撤销

Revert 对所选提交生成反向变更并创建一个新提交:

A ─ B ─ C ─ Revert(B)

原来的 B 仍存在,团队成员能看见“发生过什么、后来为何撤销”。执行前工作区必须干净。

撤销 Merge commit

Merge commit 有多个父节点,Git 需要知道哪一侧是要保留的主线。TriForge 会再要求选择父节点:

  • 第 1 个父节点通常是创建 Merge 时所在的当前分支,界面标为推荐;
  • 选择错误主线会反向应用错误的一侧。

不确定时先在 Graph 查看父子关系,或向熟悉该合并的人确认。

Mixed Reset

示例:

A ─ B ─ C   --mixed→   分支回到 A,B+C 的内容成为未暂存更改

提交 B、C 从当前分支可达历史中移除,但文件内容仍在工作区,适合重新拆分暂存和提交。仍属于历史改写;若 B/C 已 Push,不要轻率使用。

Soft Reset

分支回到目标节点,后续提交的合并结果留在暂存区。适合把最近几个尚未共享的提交合成一次新提交。

执行后先看“已暂存 Diff”,再提交。

Hard Reset

Hard Reset 会:

  • 移动当前分支;
  • 重置暂存区;
  • 恢复已跟踪工作区文件;
  • 丢弃目标节点之后当前分支可达的本地历史。

TriForge 会显示额外模态警告,并在确认后再次验证工作区指纹;确认期间只要内容又变化就取消操作。

未跟踪文件通常不会被 git reset --hard 删除,但不要把这当成备份。TriForge 不承诺能恢复被 Hard Reset 丢弃的内容。

已 Push 的提交

已共享历史优先 Revert。Reset 后本地分支和远端分叉,普通 Push 会被拒绝;0.5.0 同步推送不会自动 Force Push。

如团队确实决定改写远端历史,应在明确沟通、备份和分支保护政策允许的前提下,使用受审计流程处理,而不是为了“让按钮成功”盲目强推。

放弃单文件未暂存更改

这不是提交级回退。它只把已跟踪文件的未暂存部分恢复到暂存区/HEAD 对应内容:

  • 已暂存部分保留;
  • 未暂存部分可能永久丢失;
  • 未跟踪文件不会自动删除;
  • 执行前必须确认;
  • 确认期间文件内容或状态变化会取消。

先打开该阶段 Diff,再决定是否放弃。

冲突恢复

TriForge 能识别 Merge、Rebase、Cherry-pick、Revert 的进行中状态,并显示继续/取消入口。

继续操作

  1. 打开冲突文件;
  2. 选择或编辑最终内容,删除冲突标记;
  3. 暂存所有已解决文件;
  4. 点击“继续”;
  5. Git 若仍检测到冲突,会保留状态并再次提示。

取消操作

点击“取消操作”后还会要求确认。TriForge 重新检测进行中的操作类型,确认状态没有在等待期间变化,再调用相应 abort 命令恢复到操作开始前。

恢复误删分支或 Reset

TriForge 0.5.0 没有 reflog 恢复向导。如果刚误删分支或执行了错误 Reset:

  1. 立即停止新的清理、提交和仓库维护操作;
  2. 不要运行 git gc
  3. 在受信终端执行 git reflog 查找原提交;
  4. 用找到的完整哈希创建救援分支;
  5. 确认内容后再决定合并方式。

示例:

git reflog
git branch rescue/<name> <commit-hash>

如果不熟悉 reflog,请先复制整个仓库目录作为只读备份,再寻求有经验的人协助。

选择指南

提交已经 Push 或与别人共享?
  ├─ 是 → Revert
  └─ 否 → 是否只想重新组织提交?
           ├─ 内容保留为未暂存 → Mixed
           ├─ 内容保留为已暂存 → Soft
           └─ 明确永久丢弃 → Hard(再次确认)

Clone this wiki locally