298

我设法在我的本地 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。

4

18 回答 18

513

我陷入了困境。我创建了 head-name 文件,然后我遇到了另一个错误,说它找不到 on 文件,所以我创建了那个文件。然后我得到另一个错误,说无法读取'.git/rebase-apply/onto':没有这样的文件或目录。

所以我查看了 git文档进行变基,发现了另一个命令:

git rebase --quit

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

于 2019-02-28T20:02:23.473 回答
210

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

于 2010-09-10T18:47:30.870 回答
91

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

于 2011-01-21T10:37:10.493 回答
38

感谢@Laura Slocum 的回答

我在变基时把事情搞砸了,得到了一个分离的 HEAD

 error: could not read orig-head

这阻止了我完成变基。

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

rebase --quit

之后我检查了一个新的临时分支以将其绑定到分离的头部。

通过将它与我想要变基的分支进行比较,我可以看到新的临时分支正好处于我想要达到的状态。谢谢

于 2019-07-12T08:49:27.337 回答
7

在 Eclipse 中有同样的问题。无法从 Eclipse 中变基=>中止。

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

于 2014-04-04T06:46:29.943 回答
7

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

安装进程资源管理器:https ://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

在进程资源管理器中,查找 > 文件句柄或 DLL ...

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

Process Explorer 将突出显示锁定文件的进程(对我来说它是“grep”)。

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

于 2015-03-27T10:32:03.613 回答
5

创建一个具有此名称的文件:

touch .git/rebase-merge/head-name

而不是使用git rebase

于 2015-04-06T15:20:25.833 回答
4

在我的情况下,八git rebase --abort并且git rebase --continue正在抛出:

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

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

于 2019-02-20T12:25:41.163 回答
3

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

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

于 2018-12-06T19:07:56.400 回答
1

就我而言,这是因为我在各自的 Git 项目中打开了 SmartGit 的 Log,在各自的项目目录中打开了 Total Commander。当我关闭两者时,我能够毫无问题地重新设置基准。

我想得越多,我就越怀疑 Total Commander,即 Windows 锁定了 git rebase 试图使用的打开目录。

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

于 2016-03-09T08:51:23.290 回答
1

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

于 2019-01-03T05:34:06.477 回答
1

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

于 2019-03-28T10:13:20.330 回答
1

如果您低于状态并且 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
于 2020-05-10T01:34:14.853 回答
0

一旦你满意地完成了 X 次提交的变基,最后一个命令必须是git rebase --continue. 这样就完成了该过程并退出了变基模式。

于 2013-10-24T16:25:54.687 回答
0

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

于 2014-07-09T00:38:37.170 回答
0

就我而言,在测试了所有这些选项并且仍然遇到问题之后,我尝试sudo git rebase --abort了并且它完成了整个事情

于 2016-05-03T13:34:54.090 回答
0

尝试了其他所有方法,但重新启动,对我有用的是rm -fr .git/REBASE_HEAD

于 2019-05-07T12:59:00.943 回答
-3

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

最终我发现“Rebase ...”菜单项暂时变成了子菜单。

团队-> 变基-> 中止

它对我有用。

于 2014-10-14T12:57:15.457 回答