在日常开发中,我们有时会需要将仓库恢复到某个具体时间点之前的状态,比如「回退到今天早上 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...

 

二将 Git 仓库回退到特定版本并同步至远端

在开发过程中,有时需要将仓库回退到某个特定提交的状态,并同步到远端 GitHub 仓库,以下是详细的操作步骤及注意事项。

一本地回退到目标提交

操作命令,如SHA 为d045672fde0f91dcedb7e2212411e1c3ee66cc05(仓库首页点击 xxCommits 可以获取SHA 号)

git fetch origin
git reset --hard d045672fde0f91dcedb7e2212411e1c3ee66cc05

说明

  • --hard 选项会强制将工作区暂存区的内容全部重置为目标提交(d045672fde0f91dcedb7e2212411e1c3ee66cc05)的状态。
  • 执行后,所有在该提交之后新增或修改的文件会被自动清理,本地仓库完全回到目标提交时的状态。

二同步至远端 GitHub 仓库(覆盖现有内容)

操作命令

git push origin HEAD --force

说明

  • --force 选项会用本地当前状态强制覆盖远端仓库的内容,确保远端与本地状态一致。
  • 风险提示:此操作会彻底删除远端仓库中目标提交之后的所有提交记录,若有团队协作,需提前告知其他成员。

三清理多余文件(可选)

如果执行 reset 后仍有残留的多余文件(非版本控制范围内的文件),可使用以下命令彻底清理:

git clean -fd
  • -f:删除未跟踪的文件。
  • -d:连未跟踪的文件夹一起删除。

四清理 Git 历史中的特定文件(可选)

若需要从历史记录中彻底移除大文件敏感信息等(仅 reset 无法清理历史),可根据 Git 版本选择以下命令:

1. 适用于较新版本 Git(推荐)

git filter-repo --path filename --invert-paths

(将 filename 替换为需要移除的文件名)

2. 适用于老版本 Git

git filter-branch --tree-filter 'rm -f filename' -- --all

(将 filename 替换为需要移除的文件名)

后续操作

执行上述命令后,需再次通过强制推送同步至远端:

git push origin HEAD --force

注意事项

  1. 强制推送的风险
    强制推送(--force)会改写远端仓库的历史记录,可能导致其他协作者的提交丢失,务必在团队内部达成共识后操作。

  2. 替代方案
    若希望保留历史记录,仅删除多余文件,可使用 git rm 命令删除文件后,通过普通提交(git commit)同步,而非 reset

  3. 敏感信息处理
    若多余文件包含敏感信息(如密钥密码),除了删除文件,必须通过上述“清理历史”的步骤彻底移除历史记录中的相关内容,避免信息泄露。

通过以上步骤,可实现将仓库回退到特定状态并同步至远端的需求,但需谨慎操作,尤其注意强制推送对协作的影响。