切换到一个分支后出现“Detached HEAD”,如何进行“push”操作?

8

以下是我的操作步骤:

  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>
我接着执行了建议的命令: git push origin HEAD:origin/release/BranchName 然后出现了以下错误:

error: unable to push to unqualified destination: origin/release/BranchName 远程目标引用既不匹配现有引用,也不以refs/开头,我们无法根据源引用猜测前缀。 error: failed to push some refs to 'RepositoryName`

因此,问题来了:我做错了什么?如何修复并推送更改?

你在尝试推送的远程分支中没有本地对应分支吗? - Romain Valeri
运行 git checkout release/2018/MDP.2018.03(去掉 origin/ 部分)。使用足够新的 Git 版本,这将创建一个与远程同名分支相关联的 本地 分支。 - jub0bs
2个回答

12

字符串 origin/release/BranchName 包含了远程仓库的名称(origin)和远程分支的名称(release/BranchName)。建议的命令将它们作为分开的参数,所以你应该运行:

git push origin HEAD:release/BranchName

要理解出了什么问题,你必须明白在 Git 中,分支实际上并不存在;一个分支只是指向某个提交的方便指针。对于本地分支,在你提交时有一些方便的机制来移动该指针,但是对于远程分支,情况不同(因为除非你运行push,否则不会更新远程指针)。
当你运行以下命令时:
git checkout origin/release/BranchName

Git搜索了一个远程分支,找到了它指向的提交,并检出了该提交。然而,它没有创建或更新任何本地分支,因此当你提交时,没有创建新的指针,只有一堆提交。这就是"detached HEAD"的意思 - 你有某个内容被检出,但它没有与任何分支"连接"起来。
你应该运行的命令是:
git checkout -t origin/release/BranchName

或者这样:
git checkout release/BranchName

(或者,在较新的git版本中,用git switch替换git checkout - 在这种情况下,功能是相同的,但git switch有更少令人困惑的额外含义。)
在每种情况下,假设您还没有名为release/BranchName的本地分支,git会自动创建一个与同名远程分支“跟踪”(用于pushpull命令)的新本地分支。
然后,当您提交时,您将提交到一个普通的分支,不会出现“detached head”错误。

谢谢,git push origin HEAD:release/BranchName 成功了。 - Michael
1
@Michael,我刚刚添加了一些详细信息,告诉你如何避免将来进入“分离头”状态。现在你最好的选择是从你的“分离头”推送一次,然后使用checkout -t检出远程分支重新开始。 - IMSoP
谢谢,这个可行。 - Michael
谢谢这个...对我有用。我只是写了push origin命令,它就起作用了。 - Samiksha Jagtap

0
为了将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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接