如何修复“损坏”的交互式变基?

411

我在本地的Git仓库中搞糊涂了。我试图按照下面的步骤来修复一个损坏的提交记录。但在运行"git commit --amend"(和git rebase --interactive之后),我发现我的更改是不正确的,所以我执行了"git reset HEAD --hard"。告诉你一个不好的消息,现在交互式的rebase似乎“卡住”了。Git显示当前分支为(|REBASE-m)。我仓库中的每个命令(cd..、ls、git rebase...)都会给出以下错误:

cat: .git/rebase-merge/head-name: No such file or directory

这里是git rebase --abort的样子:

$ git rebase --abort
cat: c:/_work/project/src/git/.git/rebase-merge/quiet: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/head-name: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/orig-head: No such file or directory
HEAD is now at 4c737fb Revert "Modified file names"
rm: cannot remove `c:/_work/project/src/git/.git/rebase-merge/done': Permission denied
rm: cannot remove directory `c:/_work/project/src/git/.git/rebase-merge': Directory
not empty
cat: .git/rebase-merge/head-name: No such file or directory

这是执行 git rebase --continue 命令的结果:

$ git rebase --continue
cat: c:/_work/project/src/git/.git/rebase-merge/prev_head: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/end: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/msgnum: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/onto: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/quiet: No such file or directory
prev_head must be defined
cat: .git/rebase-merge/head-name: No such file or directory
任何想法?我希望将情况重置回我开始深思熟虑的变基操作之前的状态。
以下是git log --oneline显示当前情况:
4c737fb Revert "Modified file names"
247ac02 Modified file names
33141e6 Message modifications
10a4a04 Modified db script

这很好。

我正在使用msysgit v1.7.0.2。

20个回答

772

我遇到了麻烦。我创建了 head-name 文件,然后遇到另一个错误,说找不到 onto 文件,所以我创建了那个文件。然后我又遇到了一个错误,说无法读取“ .git/rebase-apply/onto”:没有那个文件或目录。

于是我查看了git中有关rebase的文档,找到了另一个命令:

git rebase --quit

这使我回到了原点,没有任何更改,我可以重新开始我的变基操作,就像新的一样。


49
--quit 起作用了。 --abort 没有起作用,因为rebase在一半的时候被取消了。 - Kalob Taulien
6
我遇到了与重新设置基础相关的错误,只是错误信息不同而已。尝试了 $ git rebase --abort,但输出显示 error: could not read '.git/rebase-apply/head-name': No such file or directory。最后,这个解决方法修复了我的问题:git rebase --quit - aff
4
点赞。 git rebase --quit 真的救了我。我的症状与描述的一样,但是我的情况是在尝试执行 git pull --rebase 时出现错误。请注意,我启用了自动存储 (git 版本 2.27.0.windows.1),同时还有 VS2019 运行 (指向该仓库) - 怀疑这两者的某种组合造成了问题。 - ErrCode
我曾担心在git rebase --quit之后必须重新执行所有的rebase操作,因此我首先备份了整个树,但是在退出并重新开始rebase后,没有冲突需要解决!我可能受益于在rebase开始前设置的"rerere"配置。https://git-scm.com/book/en/v2/Git-Tools-Rerere - Mark Stosberg
如已接受答案的评论所述,git rebase --quit将清除.git/rebase-merge文件夹,包括自动存储。如果您有一个自动存储(使用git rebase --autostash),请确保在运行此命令之前保存其提交哈希(在.git/rebase-merge/autostash中找到),以便您可以轻松地使用git stash apply <hash>重新应用它。 - kagmole

217

看起来 Git 试图删除 .git/rebase-merge 目录,但无法完全删除。您是否尝试复制该文件夹?如果存在,也请复制 .git/rebase-apply 文件夹。


7
谢谢您指出这一点。我只需重新启动计算机就能解决我的问题。我不确定出了什么问题,因为每次访问.git\rebase-merge文件夹时都会出现“访问被拒绝”的错误。 - Mikael Koskinen
28
重启对我没有起作用,但是 git rebase --abort (来自 https://dev59.com/MHA65IYBdhLWcg3wsgyA#4757777)确实起了作用。 - backus
7
警告一句话……当我注意到出现损坏的变基错误时,我的工作目录中有价值4小时的更改。尝试使用“git rebase --abort”命令,结果擦除了我未提交的更改……然而错误确实消失了。 - George Ananda Eman
在 .git 中删除 REBASE_HEAD、rebase-apply/ 和 rebased-patches 对我很有帮助。 - MyrionSC2
8
git rebase --quit 对我有用,但我失去了所有自动存储的更改,例如 @GeorgeAnandaEman。不过,可以通过使用 https://dev59.com/uZjga4cB1Zd3GeqPEw9U 中的答案来恢复它们,该答案解释了如何查看所有自动存储提交。 - tiho
显示剩余2条评论

94

由于一个僵尸 vim.exe 进程,我遇到了类似的问题。在任务管理器中结束它,然后执行 git rebase --abort 命令解决了这个问题。


这也是我的问题。我使用Sysinternals的handle命令,发现一个进程(sh.exe)锁定了该文件。使用pskill <pid>为我解决了这个问题。 - Paul Oliver
我尝试了git rebase --abort,但是出现了错误:error: could not read '.git/rebase-apply/head-name': No such file or directory;而git rebase --quit则起作用了。 - Andrei Diaconescu

40

感谢 @Laura Slocum 的回答

我在变基时搞砸了,导致头指针(HEAD)与当前分支不再关联,进入了游离状态

 error: could not read orig-head

有些问题阻止我完成变基。

看起来分离的 HEAD 包含了我想要的正确变基状态,所以我运行了

rebase --quit

然后我检查了一个新的临时分支,将其绑定到分离的HEAD上。

通过将其与我想要合并变基的分支进行比较,我可以看到新的临时分支正处于我想要达到的状态。谢谢


7

在Eclipse中遇到了同样的问题。无法从Eclipse中进行Rebase =>中止操作。

从Git Bash执行 git rebase --abort 对我有用。


7
在Windows系统中,如果您不想或者无法重启计算机,请参考以下步骤。
安装Process Explorer:https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
在Process Explorer中找到“查找”>“文件句柄或DLL...”。
输入错误信息中提到的文件名(对于我的错误,是“git-rebase-todo”,但在上面的问题中是“done”)。
Process Explorer将突出显示持有文件锁定的进程(对我来说是“grep”)。
终止该进程,然后您就可以按照标准方式中止git操作了。

6
在我的情况下,无论是git rebase --abort还是git rebase --continue都会报错:

错误:无法读取“.git/rebase-apply/head-name”:没有那个文件或目录

我通过手动删除.git\rebase-apply目录来解决这个问题。


6
创建一个名为该名称的文件:
touch .git/rebase-merge/head-name

然后使用git rebase


touch: 无法触及 '.git/rebase-merge/head-name':没有那个文件或目录。 - aksyuma

3

我使用的是 git版本2.19.2.windows.1

对我起作用的唯一方法是删除.git/rebase-apply/目录并执行git reset --hard命令。


3

我试过上述所有步骤,但都没有解决我的问题。最后,重新启动电脑解决了这个问题 :D


1
这是对我有效的方法。谢谢! - aksyuma

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