在日常开发中,我们有时会需要将仓库恢复到某个具体时间点之前的状态,比如「回退到今天早上 8 点前的最后一次提交」。这篇文章记录一次完整的实操过程,供自己备忘,也希望能帮到遇到类似需求的小伙伴。


🧭 场景说明

我在本地对一个 Git 仓库做了若干提交,想要回退到 今天(2025-04-16)早上 8 点前的状态。目标是找出那个时间点前的最后一次提交,并让本地及远程仓库都同步回退。


✅ 按时间查看提交并回退

第一步:查看某段时间内的提交记录

打开终端,进入项目目录后,执行如下命令:

git log --since="2025-04-15 22:00" --until="2025-04-16 08:00"

这条命令会列出从昨天晚上 10 点到今天早上 8 点之间的所有提交。你可以根据实际需要调整 --since 和 --until 的时间。

我得到的输出如下:

commit ecb4a5c5c7479e415f58bf2a714da9b2d6678698
Author: root <534640040@qq.com>
Date:   Tue Apr 15 23:03:12 2025 +0800

    文章分享设置

第二步:使用 git reset 回退到该提交

确认这个提交就是你要回退到的那个版本后,执行以下命令:

git reset --hard ecb4a5c5c7479e415f58bf2a714da9b2d6678698

这一步会让你的本地仓库彻底回到该提交的状态。


第三步:推送回退结果到远程仓库(需要取消受保护分支)

当我尝试执行以下命令时:

git push origin HEAD --force

遇到了以下报错:

remote: GitLab: You are not allowed to force push code to a protected branch on this project.
error: failed to push some refs to 'http://192.168.31.63:8081/root/blog.git'

✅ 解决办法:

  1. 打开浏览器访问 GitLab 仓库设置页面:

    http://192.168.31.63:8081/root/blog/-/settings/repository
  2. 找到 Protected Branches(受保护分支) 配置,点击 Unprotect 解保护 main 分支。

  3. 然后再次执行:

git push origin HEAD --force

这时候就可以把回退的版本同步到远程仓库了 ✅


第四步:其他电脑同步仓库(很关键)

在其他设备或开发者电脑上,如果已经 clone 了项目并需要同步这次回退操作:

git fetch origin
git reset --hard origin/main

如果担心本地有未保存的内容被覆盖,也可以先备份一下:

git checkout -b backup-before-reset
git fetch origin
git reset --hard origin/main

✅ 小结

整个过程用到的关键命令如下:

git log --since="时间" --until="时间"         # 按时间查看提交记录
git reset --hard 提交ID                      # 回退到指定提交
git push origin HEAD --force                 # 强制推送到远程(需取消保护)
git fetch origin && git reset --hard origin/main  # 其他电脑同步远程

🧠 补充建议

  • 如果你在团队协作中要回退主分支,请务必 沟通确认,以免影响他人。
  • 如果担心误操作,可以用 checkout 搭配 -b 创建新分支试验:
    git checkout -b test-revert ecb4a5c...