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

时间:2018-09-18 15:53:56

标签: git git-detached-head

这就是我所做的:

  1. 检出远程git存储库。

  2. 已添加到[remote "origin]的{​​{1}}部分:

.git/config

  1. 检出相应分支:

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

此后git checkout origin/release/BranchName报告:

  

HEAD与origin / release / BranchName分离

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

  2. 尝试到git status。这导致了错误消息:

  

致命:您当前不在分支机构中。推动历史领先   恢复到当前(分离的HEAD)状态,请使用

git push
  1. 然后我按照建议的命令进行操作:

git push origin HEAD:<name-of-remote-branch>

并获得以下信息:

  

错误:无法推送到不合格的目的地:   origin / release / BranchName目标refspec都不   匹配遥控器上的现有ref也不以refs /开头,我们   无法根据源引用猜测前缀。错误:失败   将一些引用推送到“ RepositoryName”

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

2 个答案:

答案 0 :(得分:1)

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

git push origin HEAD:release/BranchName

要了解出了什么问题,您必须了解git中的分支实际上并不存在。分支只是一些提交的便捷指针。使用本地分支,有一些方便的机制可以在提交时移动该指针,但是使用远程分支则不会发生这种情况(因为直到运行{ {1}}。

运行时:

push

Git查找一个远程分支,找出它指向的提交,然后签出该提交。但是,它没有创建或更新任何 local 分支,因此在您提交时,没有创建新的指针,只是一堆提交。这就是“分离的HEAD”的含义-您已签出某些内容,但未“附加”到任何分支。

您应该运行的是这个

git checkout origin/release/BranchName

或者这个:

git checkout -t origin/release/BranchName

在每种情况下,假设您还没有名为git checkout release/BranchName 的本地分支,git会计算出您想要的是一个“新的本地分支”,它“跟踪”(是与release/BranchNamepush命令相关联)具有相同名称的远程分支。

然后,当您提交时,您将提交到普通分支,并且不会出现“头部分离”错误。

答案 1 :(得分:-1)

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