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

411

我在本地的Git仓库中搞糊涂了。我试图按照下面的步骤来修复一个损坏的提交记录。但在运行"git commit --amend"(和git rebase --interactive之后),我发现我的更改是不正确的,所以我执行了"git reset HEAD --hard"。告诉你一个不好的消息,现在交互式的rebase似乎“卡住”了。Git显示当前分支为(|REBASE-m)。我仓库中的每个命令(cd..、ls、git rebase...)都会给出以下错误:

cat: .git/rebase-merge/head-name: No such file or directory

这里是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。

20个回答

2

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

"Original answer"的翻译是"最初的回答"。


2

如果您遇到以下情况,并且变基不再起作用,

$ 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

1
在我的情况下,是因为我已经在相应的Git项目中打开了SmartGit的日志,并在相应的项目目录中打开了Total Commander。当我关闭两个时,我就能够轻松进行变基操作。
我越想越怀疑是Total Commander的锁定导致了问题,也就是Windows试图对打开的目录进行某些操作。
友情建议:当你尝试修复问题时,始终只做一项更改。 ;)

0

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


0

一旦您成功地完成了重新定位 X 个提交,最后一个命令必须是 git rebase --continue。这将完成该过程并退出重新定位模式。


0

我在VSCode中运行了一个提交,导致它卡住了。杀掉了VS Code进程并执行了恢复(R)到rebase。这为我解决了问题。


0

我错过了“author-script”,因为它已经在我上次提交时被使用了(不小心)。我撤销了上次的提交,并将所有内容一起提交。(顺便说一下,我正在使用git-branchless)


0

我曾经遇到过同样的问题。我按照其他帖子中的建议使用了进程资源管理器,找出哪个进程锁定了文件并将其终止。然后根据需要执行 --continue 或 --abort 命令。


0
在我的情况下,经过测试所有这些选项并仍然存在问题后,我尝试了sudo git rebase --abort,它解决了整个问题。

如果你正在进行实际的变基操作,请小心。我刚刚丢失了我的更改 :'( - Freeman
它被认为是“损坏的”,然后您可以重新开始进行rebase。 - Dani.Rangelov

-3

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

最终我发现“Rebase…”菜单项被临时转换为子菜单。

团队 -> Rebase -> Abort

这对我起作用了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接