如何修复“损坏的”交互式变基?
Posted
技术标签:
【中文标题】如何修复“损坏的”交互式变基?【英文标题】:How to fix "corrupted" interactive rebase? 【发布时间】:2011-04-10 17:51:53 【问题描述】:我设法在我的本地 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 --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。
【问题讨论】:
【参考方案1】:我陷入了困境。我创建了 head-name 文件,然后我遇到了另一个错误,说它找不到 on 文件,所以我创建了那个文件。然后我得到 另一个 错误,说无法读取 '.git/rebase-apply/onto':没有这样的文件或目录。
所以我查看了 git documentation 进行变基,发现了另一个命令:
git rebase --quit
这让我回到了我的分支,没有任何变化,我可以重新开始我的变基,就像新的一样。
【讨论】:
--quit
工作。 --abort
没有,因为 rebase 中途取消了
我有类似的 rebase 相关错误,只是错误信息不同。尝试:$ git rebase --abort
输出:error: could not read '.git/rebase-apply/head-name': No such file or directory
最后,这个解决方案解决了我的问题:git rebase --quit
赞成。 git rebase --quit
绝对救了我。与描述的症状相同,但我的症状是在尝试执行git pull --rebase
后出现的,但由于某种原因失败了。请注意,我启用了 autostash(git 版本 2.27.0.windows.1)并同时运行 VS2019(指向该存储库) - 怀疑这些组合搞砸了。【参考方案2】:
看起来 Git 试图删除 .git/rebase-merge
目录,但无法完全删除。您是否尝试过复制该文件夹?如果存在.git/rebase-apply
文件夹,也请复制它。
【讨论】:
感谢您指出这一点。只需重新启动计算机,我就可以解决我的问题。我不确定出了什么问题,因为对 .git\rebase-merge 文件夹的每次访问都会导致“访问被拒绝”-错误。 重启对我不起作用,但git rebase --abort
(来自***.com/a/4757777/146044)确实起作用了。
一个警告......当我注意到损坏的 rebase 错误时,我对我的工作目录进行了 4 小时的更改。尝试了git rebase --abort
它擦除了我未分阶段的更改...尽管错误确实消失了
在 .git 中移除 REBASE_HEAD、rebase-apply/ 和 rebase-patches 对我有用
git rebase --quit
为我工作,但我丢失了所有 autostashed 更改,如 @GeorgeAnandaEman => 可以通过使用 ***.com/questions/37845799/… 中的答案来恢复它们,解释如何查看所有 autostash 提交【参考方案3】:
由于僵尸 vim.exe 进程,我遇到了类似的问题。
在任务管理器中杀死它,然后用git rebase --abort
修复它。
【讨论】:
这也是我的问题。我使用 sysinternalshandle
命令并看到一个进程(sh.exe)已锁定文件。使用pskill <pid>
为我修复了它。
我试过 git rebase --abort 但得到一个错误错误:无法读取'.git/rebase-apply/head-name':没有这样的文件或目录; git rebase --quit 工作【参考方案4】:
感谢@Laura Slocum 的回答
我在变基时搞砸了,得到了一个分离的 HEAD
error: could not read orig-head
这使我无法完成变基。
分离的 HEAD 似乎正好包含我正确的变基所需状态,所以我跑了
rebase --quit
然后我检查了一个新的临时分支以将其绑定到分离的头部。
通过将它与我想要变基的分支进行比较,我可以看到新的临时分支正好处于我想要达到的状态。 谢谢
【讨论】:
【参考方案5】:在 Eclipse 中有同样的问题。无法 Rebase=>从 Eclipse 中止。
从 Git Bash 执行 git rebase --abort 对我有用。
【讨论】:
【参考方案6】:在 Windows 上,如果您不愿意或无法重新启动机器,请参见下文。
安装进程资源管理器:https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
在进程资源管理器中,查找 > 文件句柄或 DLL ...
输入错误中提到的文件名(我的错误是“git-rebase-todo”,但在上面的问题中是“完成”)。
进程资源管理器将突出显示持有文件锁定的进程(对我来说它是“grep”)。
终止进程,您将能够以标准方式中止 git 操作。
【讨论】:
【参考方案7】:用这个名字创建一个文件:
touch .git/rebase-merge/head-name
而不是使用git rebase
【讨论】:
【参考方案8】:在我的情况下,git rebase --abort
和 git rebase --continue
正在抛出:
错误:无法读取'.git/rebase-apply/head-name':没有这样的文件或目录
我设法通过手动删除:.git\rebase-apply
目录来解决此问题。
【讨论】:
【参考方案9】:我正在使用git version 2.19.2.windows.1
。
唯一对我有用的是删除.git/rebase-apply/
目录并执行git reset --hard
。
【讨论】:
【参考方案10】:就我而言,这是因为我在各自的 Git 项目中打开了 SmartGit 的 Log,在各自的项目目录中打开了 Total Commander。当我关闭两者时,我能够毫无问题地重新设置基准。
我想得越多,我就越怀疑 Total Commander,即 Windows 锁定了 git rebase 尝试使用的打开目录。
友好的建议:当您尝试修复某些问题时,请始终一次进行一项更改。 ;)
【讨论】:
【参考方案11】:我已经尝试了上述所有步骤,但对我没有任何帮助。最后,重新启动计算机解决了这个问题:D
【讨论】:
【参考方案12】:在 Windows 上使用 SublimeText 3,只需关闭用于交互式提交版本的 Sublime 窗口即可解决问题。
【讨论】:
【参考方案13】:如果你低于状态并且 rebase 不再起作用,
$ 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
【讨论】:
【参考方案14】:一旦你满意地完成了 X number of commits 的变基,最后一个命令必须是 git rebase --continue
。这样就完成了这个过程并退出了变基模式。
【讨论】:
【参考方案15】:我遇到了同样的问题。我按照其他帖子中的建议使用了进程资源管理器(我无法找到该帖子)并找出哪个进程锁定了文件并将其杀死。然后根据需要执行 --continue 或 --abort
【讨论】:
【参考方案16】:就我而言,在测试了所有这些选项后仍然遇到问题,我尝试了sudo git rebase --abort
,它完成了整个事情
【讨论】:
如果您在实际变基过程中执行此操作,请小心。刚刚丢失了我的更改:'( 它被认为是“损坏的”,然后你从 rebase 重新开始【参考方案17】:尝试了所有其他方法,但重新启动,对我有用的是rm -fr .git/REBASE_HEAD
【讨论】:
【参考方案18】:这对我有用,并且完全适用于 OP 发布的内容(只是不会发生的变基错误):
brew update-reset
brew update
我找到了这颗宝石here。
【讨论】:
【参考方案19】:我在 Eclipse 中使用 git,我遇到了同样的问题。
最终我发现“Rebase ...”菜单项暂时变成了子菜单。
团队-> 变基-> 中止
它对我有用。
【讨论】:
以上是关于如何修复“损坏的”交互式变基?的主要内容,如果未能解决你的问题,请参考以下文章
使用 git 和 meld 进行交互式变基的 3 路合并中的三个文件是啥?