Git 推送源头在 ubuntu 18.04 上不工作

Git push origin head not working on ubuntu 18.04

所以我是一个 windows 10 用户,我在很多分支机构工作。每次我需要在分支中进行推送时,我都会使用 git push origin head。

2 天前,我决定尝试 ubuntu,并且我很喜欢使用它。唯一的问题是 git push origin head 不再工作了,每次我想推送到一个分支,我必须使用 git push origin 和那个分支名称。

这有什么原因吗?这不是世界末日,但我真的很想念使用 head 而不是输入分支名称

始终将 HEAD 全部大写。 Git 特别对待这个特定的名字。它不会特殊处理小写head

使用小写字母 有时 在某些机器上有效。特别是,它通常适用于 Windows 和 MacOS ... 有时 。但是,如果您使用 git worktree add 并在添加的工作树中工作,它也会在 Windows 和 MacOS 上停止工作。

如果您不喜欢长时间按住 Shift 键,请考虑使用 @ 拼写魔法名称。

为什么 head(小写)有效有时但不总是

Git 当前将 HEAD 信息(当前分支的名称)存储在名为 .git/HEAD 的文件中,但在添加的工作树中存储(每个添加的工作树) .git.

的子文件夹中的文件中的 HEAD 信息

当你像这样将 HEAD 全部大写时,Git 知道在适当的文件中查找 HEAD 信息——无论是 .git/HEAD 还是 .git/worktrees/.../HEAD 或任何它可能是。所以它直接进入正确的信息。

当你用小写字母写 head 时,Git 会尝试将其用作标记名称 (refs/tags/head),或用作分支名称 (refs/heads/head),或作为远程跟踪名称,例如 refs/remotes/origin/head。这个测试有点区分大小写,因为 Git 在两个地方存储分支、标签和远程跟踪名称:

  • 它们可能在名为 .git/packed-refs、and/or
  • 的纯文本文件中
  • 它们可能存储在文件系统中的普通文件中,在 .git/refs/ 下,例如,.git/refs/tags/head 将保存与名为 head 的标签关联的哈希 ID。

.git/packed-refs中的查找直接由Git自己完成,区分大小写。 .git/refs/ 中的查找由操作系统完成。 OS 的查找可能不区分大小写,具体取决于所使用的 OS 和文件系统。

当然,您可能没有名为 head 的标签或分支。您的遥控器可能有一个名为 HEAD 的符号引用,但在 Git 找到它们之前,Git 尝试在.git 查看是否有 那些 中的任何一个被命名为 head。这个测试又是由操作系统完成的。

如果您的 OS 和文件系统组合区分大小写 in,那么打开和读取名为 head 的文件的请求将打开并而是读取名为 HEAD 的明显完全不相关的文件,那么,您将获得引用此 .git/HEAD 文件的效果。因此,如果您在主工作树中,其 HEAD 信息在 .git/HEAD 中,则全小写名称 head 最终会使用它。

这在 Linux 上失败,其中普通文件系统理解文件 head 和文件 HEAD 是两个不同的文件,与 "Polish shoe polish" 不是多余的。但它在 Windows 和 MacOS 上添加的工作树也失败了,因为 Git 仅在您拼写名称 HEAD 时查找每个工作树的 HEAD 信息。如果您使用 head(小写),Git 的 OS 读作 .git/head,它会为您提供 main 的分支信息工作树而不是你的当前工作树。