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


182

我设法在本地git存储库中创建了一个小混乱。我试图通过使用以下说明修复损坏的提交。在运行“ 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 --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。


54
git rebase --quit为我工作
Juan Caicedo

Answers:


159

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


7
感谢您指出了这一点。仅通过重新启动计算机就可以解决我的问题。我不确定发生了什么问题,因为对.git \ rebase-merge文件夹的每次访问都导致“访问被拒绝”错误。
Mikael Koskinen

19
重新启动并没有为我工作,但git rebase --abort(从stackoverflow.com/a/4757777/146044所做的工作。
backus

3
只是重新启动git shell(Windows)对我git rebase --abort
有用

2
提醒一下……当我注意到损坏的rebase错误时,我在工作目录上进行了4个小时的更改。尝试了git rebase --abort它抹去了我不分阶段的更改...但是错误确实消失了
George Ananda Eman

114
重新启动或git rebase --abort仍然给我的错误。git rebase --quit为我工作。
弗拉维奥·罗德里格斯

193

我陷入了困境。我创建了名字文件,然后遇到另一个错误,说它找不到上载文件,因此我创建了该文件。然后我又收到另一个错误消息,提示无法读取“ .git / rebase-apply / onto”:没有这样的文件或目录。

因此,我查看了git 文档以进行基础调整,并找到了另一个命令:

git rebase --quit

这使我回到了分支,没有任何变化,我可以重新开始重新配置,就像新的一样。


51
git rebase --quit是!
史蒂文·肖

5
--quit工作。--abort并不是因为
改组

1
我有类似的与rebase相关的错误,只是错误信息不同。尝试:$ git rebase --abort输出:error: could not read '.git/rebase-apply/head-name': No such file or directory最后,此解决方案解决了我的问题:git rebase --quit
aff

已投票。git rebase --quit绝对救了我 与上述症状相同,但我的尝试是在尝试执行之后出现的git pull --rebase,但由于某种原因失败了。注意我启用了自动存储功能(git版本2.27.0.windows.1),并且同时运行了VS2019(指向该存储库)-怀疑其中的某些组合将其弄乱了。
ErrCode

90

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


这也是我的问题。我使用sysinternals handle命令,发现一个进程(sh.exe)锁定了文件。使用pskill <pid>修复它对我来说。
Paul Oliver

我遇到了同样的问题,但Sublime Text适合我。
ToivoSäwén

35

感谢@Laura Slocum的回答

我在重新定基础时搞砸了,并得到了一个带有

 error: could not read orig-head

这使我无法完成重新定标。

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

rebase --quit

之后,我签出了一个新的临时分支,将其绑定到分离的头上。

通过将其与要重新设置基准的分支进行比较,可以看到新的temp分支恰好处于我想要达到的状态。谢谢


7

在Eclipse中也有同样的问题。无法从Eclipse恢复基准=>中止。

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


7

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

安装Process Explorer:https : //technet.microsoft.com/zh-cn/sysinternals/bb896653.aspx

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

输入错误中提到的文件名(我的错误是“ git-rebase-todo”,但在上面的问题中,“ done”)。

进程资源管理器将突出显示对该文件保持锁定状态的进程(对我来说,它是'grep')。

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



3

在我的情况eighter git rebase --abortgit rebase --continue被扔:

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

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


2

我正在使用git version 2.19.2.windows.1

对我唯一有效的方法是删除.git/rebase-apply/目录并执行git reset --hard


1

就我而言,这是因为我在相应的Git项目中打开了SmartGit的日志,并在相应的项目目录中打开了Total Commander。当我关闭两者时,都可以毫无问题地恢复基准。

我想得越多,我就越怀疑Total Commander,即Windows在git rebase试图解决的打开目录上有锁定。

友善的建议:当您尝试修复某些问题时,请始终一次进行一次更改。;)



1

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


0

一旦您满意地完成了对X次提交的重定基础,最后一个命令必须为git rebase --continue。这样就完成了该过程,并退出了rebase模式。


0

我有同样的问题。我按照其他帖子(我找不到该帖子)中的建议使用了进程浏览器,并弄清楚哪个进程对该文件有锁定并杀死了它。然后根据需要执行--continue或--abort


0

以我为例,在测试了所有这些选项之后,仍然遇到问题,我尝试sudo git rebase --abort了一下,整个过程都完成了


如果要在实际的基准调整过程中执行此操作,请务必小心。刚刚丢失了我的更改:'(
Freeman L

它被认为是“损坏的”,然后您从重新建立基础开始
Dani.Rangelov


0

如果您处于状态之下,并且变基不再起作用,

$ git status
rebase in progress; onto (null)
You are currently rebasing.
  (all conflicts fixed: run "git rebase --continue")

然后先跑

$ git rebase -quit

然后从reflog恢复以前的状态,

$ git reflog
97f7c6f (HEAD, origin/master, origin/HEAD) HEAD@{0}: pull --rebase: checkout 97f7c6f292d995b2925c2ea036bb4823a856e1aa
4035795 (master) HEAD@{1}: commit (amend): Adding 2nd commit
d16be84 HEAD@{2}: commit (amend): Adding 2nd commit
8577ca8 HEAD@{3}: commit: Adding 2nd commit
3d2088d HEAD@{4}: reset: moving to head~
52eec4a HEAD@{5}: commit: Adding initial commit

使用,

$ git checkout HEAD@{1} #or
$ git checkout master #or
$ git checkout 4035795 #or

-3

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

最终,我发现“ Rebase ...”菜单项被临时转换为子菜单。

团队->变基->中止

它为我工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.