最近为什么使用“git rebase -i squash”会导致游离 Head?

5
为什么最近使用git rebase -i时会导致分离头?它曾经可以使用交互式rebase的结果更新当前分支。如何让交互式rebase停止进入分离HEAD状态?
我一直在使用git rebase -i来压缩我的提交,以便在从远程仓库拉取之前简化处理任何合并冲突的操作。这样,我只需要解决一个提交而不是多个提交可能导致的冲突。
示例命令
# git rebase -i <tip of public branch> <my latest commit>
git rebase -i 380647533da 82f5ee67bed

在使用vim编辑交互式rebase之后:
pick 3ec7c211c49 version1
s 82f5ee67bed some significant refactoring

编辑并保存提交后的输出结果:

[detached HEAD ea50304796c] version1
 Date: Thu Jun 6 17:04:36 2019 -0400
 14 files changed, 213 insertions(+), 52 deletions(-)
 create mode 100644     some file
 create mode 100644     some file
 create mode 100644     some file
Successfully rebased and updated detached HEAD.

这与类似的帖子git rebase -i develop HEAD leads to Detached Head不同,因为提问者想要了解如何解决那个“单一”的问题。答案是git checkout -b branchName。在这个问题中,我想知道为什么最近开始发生这种情况,以及如何解决所有未来的情况。

这与类似的帖子git rebase -i with squash cannot detach HEAD不同,因为那里的错误信息是could not detach HEAD

2个回答

7
git rebase 的语法指南如下所示:

git rebase [-i | --interactive] [<options>] [--exec <cmd>] [--onto <newbase>] [<upstream> [<branch>]] git rebase [-i | --interactive] [<options>] [--exec <cmd>] [--onto <newbase>] --root [<branch>] git rebase --continue | --skip | --abort | --quit | --edit-todo | --show-current-patch

因此,您的命令为:
git rebase -i 380647533da 82f5ee67bed

提供380647533da作为<upstream>,并提供82f5ee67bed作为<branch>

描述部分的第一段说:

如果指定了<branch>,则git rebase将在执行其他操作之前自动执行git checkout <branch>。否则,它会保留当前分支。

因此,你的git rebase相当于:

git checkout 82f5ee67bed
git rebase 380647533da

第一个命令会导致一个分离的 HEAD。当 rebase 完成时,这个分离的 HEAD 仍然保持不变。

啊哦。我觉得我脑子短路了。我把平常用于 'git diff a b' 和 'git rebase -i a' 的参数搞混了。我刚开始度假。等我回来再试一次,然后告诉你结果。 - joseph
刚从度假回来,尝试了一下。不知为何,那天我开始使用 git rebase -i a b 而不是只用 git rebase -i a - joseph

4

我正在进行以下的操作:

git rebase -i 380647533da 82f5ee67bed

当我应该去做我一直在做的事情时:

git rebase -i 380647533da

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