示例成品 · 平台演示,按左边这组点选真跑出来的
先别跑 `git gc`、`git prune`,也别再随便 `push -f`。
`git log` 看不到被覆盖的提交很正常,因为它只看当前历史;要找回要看 reflog。
按顺序做:
**1. 在强推那台机器上找旧提交 SHA**
```bash
git reflog show main --date=iso
```
如果你就是 reset 过头后强推的,直接看 reset 附近:
```bash
git reflog show main --date=iso | grep -B5 -A5 'reset'
```
`reset` 前一条的 SHA,通常就是被覆盖前的旧 `main` 顶端。找到同事的提交说明更容易确认。
**2. 先把旧 SHA 推到恢复分支**
不要急着动 `main`,先保住代码:
```bash
git branch recover-old <旧SHA>
git push origin recover-old
```
这一步不会破坏现在的主分支。
**3. 让同事确认**
让同事执行:
```bash
git fetch origin
git log origin/recover-old
```
确认被覆盖的提交都回来了。
**4. 决定要不要恢复 main**
如果强推后的 `main` 上没有任何需要保留的提交,可以恢复:
```bash
git push origin <旧SHA>:main --force
```
然后通知所有已经拉了坏 `main` 的人:
```bash
git fetch origin
git reset --hard origin/main
```
注意:`reset --hard` 会清掉本地未提交改动,让他们先 `git stash`。
如果已经有人在坏 `main` 上产生了新提交,别直接 `force push`,用合并方式把旧代码合回来:
```bash
git checkout main
git merge recover-old
git push origin main
```
---
**如果强推那台机器找不到旧 SHA:**
让同事在本地执行:
```bash
git reflog show origin/main --date=iso
```
或者让还没 pull 的同事执行:
```bash
git rev-parse origin/main
```
拿到的 SHA 就是旧提交,再按第 2 步推到 `recover-old` 分支。
点左边「开工 · 直接出成品」,出一份你自己的版本(文字免费)