记下你想回到的提交号 <commit>(如 a1b2c3d)。
A. 安全回退(不改历史,推荐已有代码已推到 GitHub)
撤销单个提交:
git revert <commit>撤销多个提交:
git revert <commit-hash1> <commit-hash2> ...
这将创建一个新的提交,其内容与指定提交相反。
B. 重写历史(危险,需强推;仅当你确定没人基于当前历史工作)
reset会让分支指针直接指回旧提交。
丢弃工作区/暂存区改动:
git reset --hard <commit> git push --force-with-lease如果你想保留改动但只回退分支指针:
软回退(仅移动 HEAD,保留暂存和工作区):
git reset --soft <commit>混合回退(默认,保留工作区,清空暂存):
git reset <commit>
C. 只回退某个(些)文件
无需动整个仓库历史:
git restore --source=<commit> -- path/to/file1 path/to/file2
git commit -m "Restore files from <commit>"
git push
(旧版 Git 可用:git checkout <commit> -- path/to/file)
批量按照 .gitignore 取消跟踪已提交的匹配文件:
git rm -r --cached .
git add .
git commit -m "Apply .gitignore"
git push
如果该文件已被推送且包含敏感信息,需要重写历史后强推(如使用 git filter-repo 或 BFG),并通知协作者重新克隆。
D. 在 GitHub 网页端回退
- 回滚合并的 PR:打开该 PR 页面 → 点击 Revert → 自动生成一个反向 PR → 合并即可。
- 回到文件旧版本:打开该文件 → History → 进到目标提交 → 点击 Browse files → 在页面右上角选择 … → Revert 或手动下载该版本文件后提交。(不同仓库权限/设置可能略有差异)
E. 误操作自救
强推或 reset 失败后,还能靠 reflog 找回:
git reflog # 找到错误前的那次位置
git reset --hard <that_sha> # 回到那个位置
git push --force-with-lease