git reset --hard origin/master 失败

46

尝试将服务器上的更改丢弃,并使其与 origin/master 完全相同:

git fetch --all
git reset --hard origin/master

我之前在同一个仓库上做过这个操作,没有问题,但是这一次出现了以下错误:

fatal: Could not reset index file to revision 'origin/master'

已尝试以下方法:

  1. 按照此处建议,移除索引并重置:

    rm .git/index
    git reset
    
  2. 也有建议在这里,可能有一些进程锁定了.git\index文件。杀死进程然后执行git reset可能会修复它,但不确定如何远程检查文件是否被锁定。似乎删除索引文件并重置会产生相同的效果。

我快疯了。真的很感激任何帮助。


2
这很奇怪。但是既然你想要重置远程,那么你可以在失去理智之前重新开始并克隆全新的存储库。不过,我希望你能找出原因,因为我担心这种情况可能会再次发生。 - Jeff Puckett
需要检查的事项:环境变量中是否设置了GIT_INDEX_FILE?如果是这样,请确认您是否有权限创建/写入该文件。如果没有设置,找到实际的索引文件(通常为.git/index,但现在也取决于add-worktree),并查看您是否有权限创建/写入该文件。 - torek
哦,GIT_INDEX_FILE 没有设置,.git/index 的权限为 644 : - Caes
我猜下一步我会尝试使用strace(或类似工具)来查看到底出了什么问题。 - torek
2
结果发现我没有文件夹的写入权限,该文件夹包含Drupal配置文件settings.php。不知道我是怎么错过它的,或者它是如何被更改的,但就在那里...修改权限后,“reset --hard origin/master”正常工作了。 :/ 感谢您的建议。 - Caes
请确保回答你自己的问题并接受它,以便关闭此内容。 - DarkMukke
4个回答

60

我也遇到过同样的问题,但十分奇怪的是reset --hard通常应该总是有效的,但似乎我的工作树与目标分支有很多差异。

我没时间深究,但偶然发现以下解决方法:

  1. 运行git gc进行垃圾回收。它会删除不必要的文件并优化本地仓库(有关git gc的更多信息可在此处找到)。

  2. 简单地使用reset,最后使用reset --hard切换到所需分支。

$ git gc

$ git reset

$ git reset --hard <target_branch>

1
非常感谢,这在2020年对我很有用。您能否解释一下它是如何工作的? - Chau Giang
3
执行 git reset 命令之前,我需要执行 rm .git/index - alper
我必须在运行“rm .git / index”之前运行“rm .git / index”,这样命令会将文件添加到舞台上。但是您可以取消暂存更改,然后只会看到原始版本和本地版本不同的文件。 - Yehouda

4

我想提一下这是我的问题的根源:

这里还建议可能有一些进程锁定了 .git\index。杀死该进程然后执行 git reset 可以解决问题,但不确定如何远程检查文件是否被锁定。似乎删除索引文件并重置也会产生同样的效果。

如果你正在本地运行诸如 Jekyll、React 等占用项目文件的进程,则使用 Ctrl+C/Cmd+C 终止该进程即可解决问题。


1
是的 - 文件锁定 - 在我们的情况下是IIS - rexall

4

在重命名一个分支并stash之后,我遇到了同样的错误信息 - 我的某个文件存在一些悬空的引用。

错误: 无法删除旧的'my_filename.ext': 参数无效
致命错误: 无法将索引文件重置为修订版本'HEAD'

我使用以下方法成功删除了旧文件:

git restore <my_filename.ext>

3
我遇到了相同的问题,后来发现磁盘空间已经用完了...

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