Git不支持git reset --date "yesterday",需先用git log --since="1 day ago"等查出昨日提交哈希,再用git reset --hard 或git revert 操作;已推送则禁用reset,改用revert;误删可用reflog恢复。

git reset --hard 不能按“昨天”执行
Git 没有内置的 git reset --date "yesterday" 这类语法。所谓“撤销昨天的提交”,本质是找一个时间点附近的 commit,再用标准回退命令操作。直接输日期会报错:fatal: ambiguous argument 'yesterday': unknown revision or path not in the working tree。
真正可行的方式是:先查出昨天范围内有哪些提交,从中挑出目标 commit hash,再用 git reset --hard <hash></hash> 或 git revert <hash></hash> 处理。
- 用
git log --before="2026-10-19" --after="2026-10-18" --oneline查昨天的提交(注意替换为实际日期) - 如果记不清具体日期,可用
git log --since="1 day ago" --until="now" --oneline看最近 24 小时内的提交 -
--since和--until支持自然语言,如"2 days ago"、"noon yesterday",但 Git 解析有偏差,建议优先用 ISO 格式"2026-10-19"
本地未推送时,用 reset 回退到指定 commit
确认目标 commit 后,回退方式取决于你是否想保留改动:
- 要丢弃所有改动(包括工作区),用
git reset --hard <commit-hash></commit-hash>—— 注意:这会清空暂存区和工作区,未提交的修改将丢失 - 只想撤掉提交记录,但代码保留在暂存区(方便改完重提),用
git reset --soft <commit-hash></commit-hash> - 想把改动放回工作区(未暂存),用
git reset <commit-hash></commit-hash>(即默认的 mixed 模式)
例如,查到昨天最后一次正确提交是 a82b1e4,执行 git reset --hard a82b1e4 后,git log 就看不到之后的提交了。
已推送到远程分支?别用 reset,改用 revert
如果那个“昨天的提交”已经 git push 上去了,尤其在 shared 分支(如 main、develop)上,reset --hard 再 push --force 会破坏他人本地历史。此时必须用 git revert。
- 撤销单个提交:
git revert <commit-hash></commit-hash>,会生成一条新提交,内容是原提交的反向变更 - 撤销从某提交到 HEAD 的连续范围(含合并):
git revert <oldest-hash>^..HEAD</oldest-hash>(注意^表示“不包含起始提交”) - 如果 revert 后出现冲突,Git 会暂停并提示你解决;解决后
git add . && git revert --continue
执行后记得 git push 推送 revert 提交——它是一次普通提交,不会触发强制推送警告。
reflog 是你最后的安全网
哪怕你已经 reset --hard 并且关掉了终端,只要没执行过 git gc,被删掉的提交通常还在 reflog 里。这是 Git 自动维护的操作日志,不随 reset 清除。
- 运行
git reflog,你会看到类似a82b1e4 HEAD@{0}: reset: moving to a82b1e4、f3a9c21 HEAD@{1}: commit: 修复登录 bug的记录 - 想找回
f3a9c21,直接git reset --hard HEAD@{1}即可恢复 - reflog 默认只保留 90 天,且仅存在于本地仓库,不能用于恢复远程已丢失的提交
真正容易被忽略的是:reflog 不显示时间戳,只靠序号和动作描述判断;而 git log -g 可以带时间列,更利于定位“昨天”的那条记录。


















