检查分支后分离 HEAD;如何“推”?
Detached HEAD after checking out a branch; how to `push`?
这是我所做的:
检查了远程 git 存储库。
已添加到 .git/config
的 [remote "origin]
部分:
fetch = +refs/heads/release/BranchName:refs/remotes/origin/release/BranchName
- 查看对应分支:
git checkout origin/release/BranchName
之后 git status
报告:
HEAD detached from origin/release/BranchName
添加并签入了一些修改。
尝试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>
- 然后我按照建议的命令操作:
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" 错误。
这是我所做的:
检查了远程 git 存储库。
已添加到
.git/config
的[remote "origin]
部分:
fetch = +refs/heads/release/BranchName:refs/remotes/origin/release/BranchName
- 查看对应分支:
git checkout origin/release/BranchName
之后 git status
报告:
HEAD detached from origin/release/BranchName
添加并签入了一些修改。
尝试
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>
- 然后我按照建议的命令操作:
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" 错误。