【问题标题】:Git rebase process gets stuck with detached headGit rebase 进程卡在分离的头上
【发布时间】:2017-12-29 12:02:25
【问题描述】:

我正在尝试通过运行git rebase -i HEAD~3(使用“nano”编辑器)然后将该提交的默认pick 选项更改为rreword(在初始变基文件窗口上),并且不修改任何其他内容。我在master 分支上做,如果有用的话。

一旦我保存文件,Git,它不会像往常一样向我显示下一个变基窗口来为该提交选择一个新名称,而是将自身放置并通知我该提交的分离 HEAD 状态,这也是从那时起在git status 命令上显示,直到我输入git checkout master

无论我尝试多少次,都会发生同样的事情。

附加说明:我之前通过运行单个命令将使用的编辑器更改为“nano”:git config --global core.editor nano

编辑:根据要求,这是 Git 在我保存 TODO 列表时给我的消息:

adrian$ git rebase -i HEAD~1

注意:查看“da91bbcedc78cb2ebcaa9dc51f38c8d0a550195d”。

您处于“分离 HEAD”状态。你可以环顾四周,做实验 更改并提交它们,您可以丢弃您在此所做的任何提交 在不影响任何分支的情况下执行另一次结帐。

如果你想创建一个新分支来保留你创建的提交,你可以 再次使用 -b 和 checkout 命令来执行此操作(现在或以后)。示例:

git checkout -b

HEAD 现在在 da91bbc... 测试消息

此存储库已针对 Git LFS 进行了配置,但在您的路径中未找到“git-lfs”。如果您不再希望使用 Git LFS,请通过删除 .git/hooks/post-checkout 来移除此挂钩。 无法分离 HEAD

此时运行git rebase --continue后的输出:

没有正在进行的变基?

【问题讨论】:

  • 你一定是做错了什么,因为变基不应该让你进入分离的 HEAD 状态。你确定你包含了你在变基时采取的每一个步骤吗?这在我使用 Git 的 6 年中从未发生过。
  • 我确定。我没有提到的唯一可能的错误是因为我没有考虑过,在这个过程的几次尝试中,我在初始窗口上写了一个新的提交文本(你首先必须切换到 r 或 @987654331 @option) 由错误的直觉冲动引起。也许这会导致从那时起触发发行。
  • 根据我的经验,启动 rebase 将应用提交,并且对于每次提交,bash 都会弹出一个带有原始提交的 emacs。我可以选择是否编辑该消息。无论如何,一旦我 save 并退出,rebase 就会继续。退出前是否保存了提交信息?
  • 例如,您的编辑器可能不会返回状态 0。或者你可能有一个范围内的合并提交。
  • 您是尝试使用e 还是r,执行git commit --amend,更改标题,然后git rebase --continue

标签: git rebase


【解决方案1】:

当您将edit 放入交互式 rebase 的待办事项文件中时,分离的 HEAD 消息通常会出现。您一定是错误地将edit 放在那里而不是reword。或者由于在您的输出中发现错误,Git 可能已经进入了这种模式(这也是在冲突中进入的):

此存储库已针对 Git LFS 进行了配置,但在您的路径中未找到“git-lfs”。如果您不再希望使用 Git LFS,请通过删除 .git/hooks/post-checkout 来移除此挂钩。无法分离 HEAD

您应该先解决此错误,然后再继续。 Git 告诉你该怎么做。

edit 模式允许像reword 模式一样修改提交消息,也可以修改文件内容。因此,Git 让您处于可以提交更改然后使用 git rebase --continue 继续变基的状态。

edit模式下编辑提交消息(如reword

如果您只想编辑提交消息并继续变基,请运行

git commit --amend

打开编辑器让您编辑提交消息。完成后,运行

git rebase --continue

留下未完成的变基

一旦我保存文件,Git,它不会像往常一样向我显示下一个变基窗口来为该提交选择一个新名称,而是将自身放置并通知我该提交的分离 HEAD 状态,这也是从那时起在git status 命令上显示,直到我输入git checkout master

这不是留下未完成的变基的正确方法,你应该使用

git rebase --abort

改为。

【讨论】:

  • 按照 Git 告诉我的操作(删除文件 .git/hooks/post-checkout),然后执行另一个操作(删除另一个文件 .git/hooks/pre-push)解决了问题.我只是看不到这些 Git LFS(大文件支持)消息与 rebase 失败的关系。作为回答您的附注,不,我没有错误地输入e 选项,我总是继续使用git rebase --abort,但是这个问题只是消除了变基,因此这些相关命令不起作用。谢谢!
【解决方案2】:

我在git rebase -i 上遇到了同样的问题,输出完全相同,但 git 完全没有说明原因。

通过反复试验,我最终发现我的结帐后挂钩 (repodir/.git/hooks/post-checkout) 以非零状态退出。一旦我在它的末尾添加了一个exit 0,rebase 就会成功,而不会使 repo 处于分离的 HEAD 状态。

【讨论】:

  • 你在 .gitattributes 中明确使用了 lfs 吗?我想知道即使你不使用它是否也会触发错误
  • 我没有在 .gitattributes 中明确使用 lfs,没有。
  • 失败的钩子也给我造成了这个问题。我使用git rev-parse --git-dir 找到.git 目录和它下面的文件,但是在使用git worktree 时不起作用(它给出了.git 文件,它告诉在哪里可以找到类似目录的结构)。切换到git rev-parse --git-common-dir 成功了
猜你喜欢
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 2013-12-23
  • 2013-10-31
  • 1970-01-01
  • 2022-08-04
相关资源
最近更新 更多