7

这是我所做的:

  1. 签出远程 git 存储库。

  2. 添加到以下[remote "origin]部分.git/config

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

  1. 查看对应的分支:

git checkout origin/release/BranchName

之后git status报道:

HEAD 与 origin/release/BranchName 分离

  1. 添加并检查了一些修改。

  2. 试图git push. 这导致了错误消息:

致命:您当前不在分支上。要将历史推送到当前(分离的 HEAD)状态,请使用

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

git push origin HEAD:origin/release/BranchName

并得到以下信息:

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

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

4

2 回答 2

10

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

git push origin HEAD:release/BranchName

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

当你跑的时候:

git checkout origin/release/BranchName

Git 查找了一个远程分支,找出它指向的提交,并检查了该提交。但是,它没有创建或更新任何本地分支,所以当你提交时,没有创建新的指针,只是一堆提交。这就是“分离的 HEAD”的意思——你已经检查了一些东西,但它没有“附加”到任何分支。

你应该运行的是这样的:

git checkout -t origin/release/BranchName

或这个:

git checkout release/BranchName

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

然后,当您提交时,您将提交到一个正常的分支,并且不会出现“分离头”错误。

于 2018-09-18T16:01:09.970 回答
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

于 2018-09-18T15:58:48.327 回答