Git - 如何修复“损坏的”交互式rebase?

问题描述 投票:86回答:16

我设法在我的本地git存储库中创建了一个小混乱。我试图通过使用following instructions来修复损坏的提交。在运行“git commit --amend”之前(以及git rebase --interactive之后)我决定我的更改不正确,所以我执行了“git reset HEAD --hard”。我告诉你,这不是一个好主意。

现在,交互式基础似乎被“卡住了”。 Git将当前分支显示为(| REBASE-m)。我的存储库中的每个命令(cd ..,ls,git rebase ...)都会出现以下错误:

cat:.git / rebase-merge / head-name:没有这样的文件或目录

以下是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的结果 - 继续:

$ 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

有任何想法吗?我想把情况重新恢复到我开始我精心设计的rebase操作之前的状态。

以下是git log --oneline如何显示情况:

4c737fb Revert "Modified file names"
247ac02 Modified file names
33141e6 Message modifications
10a4a04 Modified db script

这很好。

我正在使用msysgit v1.7.0.2。

git msysgit git-rebase
16个回答
96
投票

看起来Git试图删除.git/rebase-merge目录,但无法完全删除它。你有没有尝试过复制该文件夹?如果存在,还要复制.git/rebase-apply文件夹。


1
投票

我正在使用.git\rebase-apply

对我有用的唯一的事情是删除git rebase --continue目录并做一个git version 2.19.2.windows.1


1
投票

使用Windows上的Sublime Text 3,只需关闭用于交互式提交版本的Sublime窗口即可解决问题。


1
投票

谢谢@Laura Slocum的回答

我在变调时把事情搞砸了,得到了一个独立的HEAD

.git/rebase-apply/

这使我无法完成变革。

分离的HEAD似乎恰好包含了我正确的rebase所需状态,所以我跑了

git reset --hard

然后我检查了一个新的临时分支,将它绑定到分离的头部。

通过将它与我想要重新分支的分支进行比较,我可以看到新的temp分支正好处于我想要达到的状态。谢谢


0
投票

我有同样的问题。我在其他帖子中建议使用进程资源管理器(我无法找到该帖子)并找出哪个进程锁定文件并将其终止。然后根据需要执行--continue或--abort


0
投票

在我的情况下测试所有这些选项,仍然有问题,我尝试 error: could not read orig-head ,它做了整个事情


0
投票

我已经尝试了上面提到的所有步骤,但对我没什么用。最后,重新启动计算机可以解决此问题:D


0
投票

尝试了其他一切,但重新启动,对我有用的是rebase --quit


-2
投票

我在eclipse中使用git,我遇到了同样的问题。

最终我发现“Rebase ...”菜单条目暂时转换为子菜单。

Team-> Rebase - > Abort

它对我有用。


85
投票

由于zombie vim.exe进程,我遇到了类似的问题。在任务管理器中杀死它,然后git rebase --abort修复它。


45
投票

我陷入了困境。我创建了头名文件,然后我遇到另一个错误,说它找不到文件,所以我创建了该文件。然后我得到另一个错误,说无法读取'.git / rebase-apply / onto':没有这样的文件或目录。

所以我看了git documentation的变基,发现了另一个名为git rebase --quit的命令。这让我回到了我的分支上,没有任何变化,我可以重新开始我的反叛,好像新的一样。


7
投票

在Eclipse中有同样的问题。无法Rebase =>从Eclipse中止。

从Git Bash执行git rebase --abort为我工作。


6
投票

在Windows上,如果您不愿意或无法重新启动计算机,请参阅下文。

安装Process Explorer:https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

在Process Explorer中,查找>文件句柄或DLL ...

输入错误中提到的文件名(对于我的错误,它是'git-rebase-todo',但在上面的问题中,'完成')。

Process Explorer将突出显示锁定文件的进程(对我而言,它是'grep')。

杀死进程,您将能够以标准方式中止git操作。


4
投票

使用以下名称创建一个文件:

touch .git/rebase-merge/head-name

而不是使用git rebase


3
投票

在我的情况下,qazxsw poi和qazxsw poi投掷:

错误:无法读取'.git / rebase-apply / head-name':没有这样的文件或目录

我设法通过手动删除:git rebase --abort目录来解决此问题。


1
投票

一旦你令人满意地完成了对X数量的提交,最后一个命令必须是git rebase --continue。这样就完成了该过程并退出了rebase模式。


1
投票

在我的情况下,这是因为我在相应项目目录中的相应Git项目和Total Commander中打开了SmartGit的Log。当我关闭时,我能够毫无问题地进行改装。

我想的越多,我就越怀疑Total Commander,即Windows在打开的目录上锁定了git rebase正试图用的东西。

友好建议:当您尝试修复某些内容时,请务必一次更改一次。 ;)

© www.soinside.com 2019 - 2024. All rights reserved.