Git Reset --hard
最后更新
git reset --hard 把分支移动到目标提交,并强制让暂存区和工作区与之完全一致,在这个过程中丢弃所有未提交的改动。它是 git reset 中破坏性最强的模式,所以运行之前要确认你不再需要当前的工作。
不小心 reset 掉了某个提交?通常可以通过 git reflog 找回。在终端在线编辑器中放心试试这些命令,浏览器里就是真正的 shell。
语法
| 命令 | 作用 |
|---|---|
git reset --hard | 丢弃所有未提交的改动(停留在 HEAD) |
git reset --hard HEAD~1 | 删除最后一个提交及其改动 |
git reset --hard <hash> | 强制把分支退回到指定提交 |
git reset --hard origin/main | 让本地分支与远程完全一致 |
找回被 hard reset 的提交
被 reset 掉的已提交工作,通常仍然可以找回。
| 步骤 | 命令 | 结果 |
|---|---|---|
| 1 | git reflog | 列出 HEAD 到过的位置及其哈希值 |
| 2 | git reset --hard <hash> | 跳回 reset 之前的提交 |
git reset --hard 常见问题
git reset --hard 到底做了什么?
它把当前分支移动到目标提交,并覆盖暂存区和工作区,使它们与该提交一致。所有未提交的改动,无论是否已暂存,都会被丢弃。
--soft 会把改动保留在暂存区,--mixed 会把改动保留为未暂存状态,而 --hard 是唯一会丢弃改动的模式。怎么丢弃所有本地更改?
不带提交参数运行
git reset --hard,把工作区重置到最后一次提交,清除所有未提交的修改。reset 不会处理未跟踪的文件,如果也想清掉它们,接着运行 git clean -fd。怎么让本地分支与远程保持一致?
先运行
git fetch,再运行 git reset --hard origin/main(换成你的分支名)。这会强制让本地分支与远程完全一致,丢弃与远程不同的本地提交和改动。本地分支被搞乱、只想要远程版本时,这招很有用。git reset --hard 可以撤销吗?
已提交的工作通常可以:运行
git reflog 找到 reset 之前分支指向的提交,再运行 git reset --hard <hash> 回到那里。从未提交过的改动(只存在于工作区)无法恢复,所以使用 --hard 要谨慎。可以在线练习吗?
可以。打开终端在线编辑器,就能在浏览器里的真实 shell 中运行
git reset --hard,无需安装。Coddy 的免费互动 Git 课程也会一步步教你重置和撤销更改。