【问题标题】: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。

【问题讨论】:

    标签: git msysgit git-rebase


    【解决方案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(来自stackoverflow.com/a/4757777/146044确实起作用了。
    • 一个警告......当我注意到损坏的 rebase 错误时,我对我的工作目录进行了 4 小时的更改。尝试了git rebase --abort 它擦除了我未分阶段的更改...尽管错误确实消失了
    • 在 .git 中移除 REBASE_HEAD、rebase-apply/ 和 rebase-patches 对我有用
    • git rebase --quit 为我工作,但我丢失了所有 autostashed 更改,如 @GeorgeAnandaEman => 可以通过使用 stackoverflow.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 ...”菜单项暂时变成了子菜单。

                                团队-> 变基-> 中止

                                它对我有用。

                                【讨论】:

                                  猜你喜欢
                                  • 2013-09-19
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2011-09-04
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2010-09-25
                                  相关资源
                                  最近更新 更多