git push origin HEAD : remote_branch 和 git push origin local_branch:remote_branch 有什么区别?

what is the difference between git push origin HEAD : remote_branch and git push origin local_branch:remote_branch?

当我想将更改推送到远程 repo 分支时,我需要 运行 git push origin local_branch:remote_branch 但有时不起作用 即使得到 error:src refspec local_branch 也不匹配。 运行git push origin HEAD:remote_branch会很好用 我想知道这些有什么区别 谢谢!

重现我的步骤:

git checkout -b local_branch origin master

develop based on the local_branch...

git add .
git commit -m 'xxx'
git push origin HEAD:remote_branch  
//correct

git push origin local_branch:remote_branch
//error

git branch 
// can see local_branch

git push 命令接受位置参数:

git 推送 <em>远程</em> <em>refspec</em>

git fetch 命令的工作原理类似。)您的问题是关于 refspec 部分。

refspec,在Git中,本质上是1一对用冒号分隔的名字: 字符,所以 HEAD:<em>name2</em><em>name1</em>:<em>name2</em> 工作。对于 git push,左侧的名称——HEADname1——必须是 你的[=77] 中的有效名称=] 存储库,因为 Git 将需要使用该名称来查找提交哈希 ID。右边的名字——name2——将被发送给 other Git,接收你的 git push 命令。您的 Git 将要求其他 Git 设置 名称 name2.

当您使用 HEAD 时——它几乎总是 2 代表您自己存储库中的有效哈希 ID——您的 Git 将确定您在哪个分支在,3 并使用该分支名称查找要发送的提交的哈希 ID。 (要查看您所在的分支,例如,使用 git branchgit status。)

当您使用 name1 例如 local_branch 时,此 必须 已经是有效名称您自己的本地 Git 存储库。它可以是分支名称,也可以是标记名称,甚至是其他类型的名称,但通常应该是分支名称。如果 git branch 没有将 local_branch 显示为分支名称(并且它不是标记或其他名称),您将收到您看到的错误消息:src refspec local_branch does not match any.


1这掩盖了很多重要的细节,所以我们可以在这里专注于双名版本。特别是 refspecs 以一个可选的加号开头,以设置 force 标志,并且可以使用原始哈希 ID,and/or 通过仅使用一个名称来省略冒号,在某些情况下案例。

2nameHEAD 本身总是有效的,即使在“分离 HEAD”模式下,但您可以在 未出生的分支 上,在这种情况下 HEAD 还不代表提交。

3在“分离 HEAD”模式下,您不在 任何 分支上。不过,大多数用户只会在有冲突的 rebase 期间处于此模式。