git reset --hard origin/master 是什么意思?

376

我执行了 git pull 命令后遇到一个错误:

下列工作区文件将被合并重写... 在进行合并之前,请将它们移动或删除。

为了解决这个问题,我采取了以下措施:

git fetch
git reset --hard origin/master

现在当我执行git pull时,它会显示所有内容都是最新的。我想知道在运行这些命令时到底发生了什么。 我知道git fetch会从远程仓库中获取更改,但不会将其合并到我的本地版本库中。

git reset --hard origin/master的含义是什么?它是如何工作的?

4个回答

712
git reset --hard origin/master

说:抛弃我所有已经暂存和未暂存的更改,忘掉当前本地分支上的所有内容,并使其与 origin/master 完全相同。

你可能在运行命令之前就想问这个问题了。使用与“硬重置”相同的术语暗示了它具有破坏性。


21
您可以使用 git reset --hard HEAD@{1} 撤销此次操作。HEAD@{1} 的值因情况而异,建议在 git reflog 中查找它。 - Nils Werner
2
请注意,@NilsWerner的撤销移动方法不会恢复已暂存和未暂存的更改。它们永远消失了。 - Michael Anderson
4
使用 git fsck --lost-found 命令仍然可以找回暂存文件,但这些文件将不会被连接到它们原来的文件路径上,可能会很难进行筛选。 - CB Bailey
2
当你在本地主分支上提交了更改而不是本地分支时,将本地主分支重置为origin/master通常很有用。只需为最新的提交创建一个本地分支,然后将本地主分支重置为origin/master。然后,您可以根据需要从主分支合并或变基您的分支。 - Dr. Mike Hopper
2
“暗示”是描述这种情况的好方式,因为它并不明显或明确。 - Ben Sandeen
显示剩余2条评论

11

在新版的 git (2.23+) 中,您可以使用:

git switch --force-create master origin/master

相关的参考文献


0
如上所述,当您想放弃更改并强制将 HEAD 移回到 origin/master 时,可以使用此命令。
如果您错误地重置了并放弃了更改,您可以随时使用 git reflog 命令查看本地存储库历史记录列表,以查找所需的提交 sha 并检出它。
您可以:
- 使用 git checkout 命令来检出指向所需提交的新分支。 - 使用 git reset HEAD --hard 命令将您的 HEAD 移回到所需提交。

0

这只是为了在您已经在主分支上工作并想要返回到原始/主分支而没有任何工作痕迹时重置到主分支的异常情况。

想象一下,您还没有检出新分支,因为您不想决定其名称。然后,您需要删除存储库文件夹并再次克隆,就像新手时代一样。

为什么会这样呢?

git reset --hard origin/master 仅在本地分支中作为完全擦除工作。如果您实际上在主分支中,并且已经进行了更改,则只能放弃所有已更改或修改的文件。您无法删除添加的文件夹。如果您不想手动删除它们,则必须删除整个存储库文件夹并再次克隆。即使在“硬重置”之后,这些空文件夹仍然存在,这与.gitignore文件无关。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接