检查分支后分离 HEAD;如何“推”?

Detached HEAD after checking out a branch; how to `push`?

这是我所做的:

  1. 检查了远程 git 存储库。

  2. 已添加到 .git/config[remote "origin] 部分:

fetch = +refs/heads/release/BranchName:refs/remotes/origin/release/BranchName

  1. 查看对应分支:

git checkout origin/release/BranchName

之后 git status 报告:

HEAD detached from origin/release/BranchName

  1. 添加并签入了一些修改。

  2. 尝试git push。这导致错误消息:

fatal: You are not currently on a branch. To push the history leading to the current (detached HEAD) state now, use

git push origin HEAD:<name-of-remote-branch>
  1. 然后我按照建议的命令操作:

git push origin HEAD:origin/release/BranchName

并得到以下信息:

error: unable to push to unqualified destination: origin/release/BranchName The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. error: failed to push some refs to 'RepositoryName`

因此问题:我做错了什么?如何解决这个问题并推动更改?

为了将 HEAD 推送到远程分支,远程分支必须已经存在。当远程分支不存在时,我所做的是将任何其他分支推送到我想要创建的远程分支,然后推送 HEAD:

git push some-remote random-local-branch:remote-branch git push some-remote -f HEAD:remote-branch

或者你可以临时创建一个本地分支,推送它然后删除分支

git branch temp git push some-remote temp:remote-branch git branch -d temp

字符串 origin/release/BranchName 包含遥控器名称 (origin) 和遥控器 b运行ch 名称 (release/BranchName)。建议的命令将这些作为单独的参数,因此您应该 运行:

git push origin HEAD:release/BranchName

要了解出了什么问题,您必须了解在 git 中,b运行 并不真正存在; a b运行ch 只是指向某些提交的方便指针。对于本地 b运行ch,有一些方便的机制可以在您提交时移动该指针,但是对于 remote b运行ch,则不会发生(因为在 运行 push 之前你不会更新远程指针)。

当你 运行:

git checkout origin/release/BranchName

Git 查找远程 b运行ch,找出它指向的提交,并检查该提交。但是,它没有创建或更新任何 local b运行ch,因此当您提交时,不会创建新指针,只是一堆提交。这就是 "detached HEAD" 的意思 - 你已经检查了一些东西,但它不是 "attached" 任何 b运行ch.

你应该 运行 是这样的:

git checkout -t origin/release/BranchName

或者这样:

git checkout release/BranchName

在每种情况下,假设您还没有名为 release/BranchName 的本地 b运行ch,git 将计算出您想要的是 new local b运行ch which "tracks" (与 push and pull commands 关联) the remote b运行ch of the同名。

然后,当您提交时,您将提交到正常的 b运行ch,并且不会出现 "detached head" 错误。