IntelliJ Git 集成插件:尝试结帐时将 ^0 附加到分支名称

IntelliJ Git Integration plugin: ^0 appended to branch name when checkout is attempted

我使用 IntelliJ Git 集成插件。我在多存储库模式下运行,通常一切正常。

当我告诉 Git 通过键入而不是从 multi-repo/branch UI 中选择它来检查分支名称时,它会将 ^0 附加到分支名称,从而导致我正在以 Detached Head 状态签出的控制台消息。我对 'detached head' 的含义比对插入符号“^”语法更熟悉,所以我不能 100% 确定消息的准确性。

尽管如此,有人知道为什么会这样吗?为什么它选择签出 mybranch^0 而不是 mybranch?

(从右下角的 Git UI,select 回购,选择 'Checkout tag or revision',键入分支名称而不是 select 从 UI 分支列表)

"Console" 在 IntelliJ 中显示:

09:50:54.244: [reponame] git -c core.quotepath=false -c log.showSignature=false 结帐功能/branchName^0--

Git bash 显示分离头状态而不是在分支上:

user@WORKSTATION MINGW64 /c/dev/intellij projects/repo-name ((b72ad203...))

在 Git 中,直接检查标签或提交哈希总是会让您进入“分离的 HEAD”状态。为了使“checkout tag or revision”的行为一致,Git 插件故意添加 ^0 以便您在“分离的 HEAD”状态下检查所选分支上的最新提交,就像您直接键入该提交的哈希一样。也就是说,它这样做 以便 “签出标签或修订版”始终使您处于“分离的 HEAD”状态。

如果不这样做,实现这种效果会困难得多:您必须在日志中查找哪个提交是该分支上的最新提交,然后复制粘贴提交哈希进入“结帐修订”弹出窗口。

如果这不是您想要的,请不要使用“签出标签或修订版”。相反,只需从分支 UI 中选择分支。不要忘记,在 IntelliJ 中,每个列表和菜单都有提前输入过滤功能,因此您可以键入分支名称中的一些字母,以避免必须阅读整个列表。

^ 到底是什么东西?

Git 中的 ^ 符号选择父提交。 commit^commit^1 表示第一个父级,commit^2 表示第二个父级(即合并),依此类推。 ^0 表示相同的提交。 commit 可以是任何命名提交的方式,包括哈希或分支名称。

因为您可以使用分支名称,所以 branch^0 表示 branch 上的最新提交,但它命名的是提交本身,而不是分支。因为它指定了一个特定的提交,而不是一个分支,所以它进入“分离的 HEAD”状态。

没有通过在 IntelliJ 中键入来签出分支的操作​​。有一个名为 Checkout Tag 或 Revision 的操作,它旨在检查到分离状态。看到丹的回答,https://youtrack.jetbrains.com/issue/IDEA-181686

要在 IntelliJ 中签出分支,请使用相应分支操作列表中的签出操作。 Branches popup支持speedsearch,所以你不用鼠标也能做到:

  1. 使用快捷方式打开分支弹出窗口 - Ctrl+Shift+[Backquote] 在 Win 上,检查键盘映射
  2. 输入分支名称
  3. Enter 打开操作列表
  4. Select 操作和 Enter 执行