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 的分支信息工作树而不是你的当前工作树。
所以我是一个 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
全部大写时,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 的分支信息工作树而不是你的当前工作树。