记下你想回到的提交号 <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