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

时间:2010-09-10 13:37:24

标签: git msysgit git-rebase

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

现在,交互式rebase似乎“陷入困境”。 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

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

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

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

这很好。

我正在使用msysgit v1.7.0.2。

19 个答案:

答案 0 :(得分:85)

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

答案 1 :(得分:84)

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

答案 2 :(得分:20)

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

所以我查看了git documentation进行基础调试,发现了另一个名为git rebase --quit的命令。这使我重新回到了分支,没有任何变化,我可以重新开始重新配置,就像新的一样。

答案 3 :(得分:7)

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

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

答案 4 :(得分:6)

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

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

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

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

Process Explorer将突出显示锁定文件的过程(对我来说,这是' grep')。

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

答案 5 :(得分:4)

使用以下名称创建文件:

touch .git/rebase-merge/head-name

而不是使用git rebase

答案 6 :(得分:2)

在我的情况下,八号手git rebase --abortgit rebase --continue抛出:

  

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

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

答案 7 :(得分:1)

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

答案 8 :(得分:1)

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

$ 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

答案 9 :(得分:1)

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

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

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

答案 10 :(得分:0)

这对我有用,并且完全适用于 OP 发布的内容(rebase 错误,只是不存在):

brew update-reset
brew update

我发现了这颗宝石 here

答案 11 :(得分:0)

感谢@Laura Slocum的回答

我在重新定基时弄乱了东西,并用一个独立的HEAD

 error: could not read orig-head

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

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

rebase --quit

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

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

答案 12 :(得分:0)

尝试了除重新启动以外的所有操作,对我有用的是rm -fr .git/REBASE_HEAD

答案 13 :(得分:0)

我已经尝试了上述所有步骤,但对我没有任何帮助。最后,重启计算机可以解决此问题:D

答案 14 :(得分:0)

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

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

答案 15 :(得分:0)

在我的情况下,在测试了所有这些选项后仍然遇到问题我尝试了sudo git rebase --abort并完成了整个事情

答案 16 :(得分:0)

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

答案 17 :(得分:-1)

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

答案 18 :(得分:-2)

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

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

Team-> Rebase - >中止

它对我有用。