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

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 修复它。

【讨论】:

这也是我的问题。我使用 sysinternals handle 命令并看到一个进程(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 --abortgit 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 路合并中的三个文件是啥?

Excel 文件阻止我在 IntelliJ Idea 中进行交互式变基

git 交互式变基 - 编辑与中断

如何修复损坏的 SQL 视图

git 修改已提交的 commit