首页 > 解决方案 > git push origin HEAD : remote_branch 和 git push origin local_branch:remote_branch 有什么区别?

问题描述

当我想将更改推送到远程 repo 分支时,我需要运行 git push origin local_branch:remote_branch ,但有时甚至会出现错误: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

标签: gitgithubgit-push

解决方案


git push命令采用位置参数:

git push remote refspec

(该git fetch命令的工作方式类似。)您的问题是关于refspec零件的。

Git 中的refspec本质上是1一对由冒号分隔的名称:,因此两者都可以使用。对于,左侧的名称——<code>HEAD 或——必须是存储库中有效名称,因为 Git 需要使用该名称来查找提交哈希 ID。右边的名字——<em> ——将被发送到另一个Git,也就是接收你命令的那个。您的 Git 将要求其他 Git 设置名称。HEAD:name2name1:name2git pushname1name2git pushname2

当您使用时(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 以可选的加号开头,以设置强制标志,并且在某些情况下可以使用原始哈希 ID,和/或通过仅使用一个名称来省略冒号。

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

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


推荐阅读