当我在我的gitolite存储库上创建一个新的repo时,我总是必须输入以下命令才能开始将代码推送到服务器。
git push origin master:refs/heads/master
它做了什么?
我的猜测是,这与头部参考不确定有关。有人可以向我解释一下吗?
答案 0 :(得分:28)
此命令有三个部分:
git push
这会调用push命令
origin
这会命名您要推送的遥控器。这是存储在.git / config中的一个名为遥控器(您可以使用git remote
列出这些遥控器),一个URL或令牌.
,这意味着当前存储库。
master:refs/heads/master
这称为“refspec”,您可以在git push
的手册页中阅读它。但总的来说,它由两部分组成,用冒号分隔。第一部分是本地分支的名称,第二部分是远程存储库上的分支的名称(在本例中为origin
)。这个特殊的refspec可以缩短为master:master
。
一般来说,人们可以进一步缩短refspec。仅指定master
作为refspec相当于在遥控器上使用相同的名称,因此master
与master:master
相同。
答案 1 :(得分:5)
master:refs/heads/master
是refspec。
refspecs
的格式为+<src>:<dst>
所以这里master是你本地仓库的ref,你正在推动远程(原点)上的refs/heads/master
refspec。 master
实际上是refs/heads/master
的缩写。
事实上,你可以做git push origin master
,这样就可以将你的本地主人推送到远程主人。只有当你想要推送到另一个ref时才需要明确指定目标引用。
同样只是git push
也有默认行为,在第一次推送并在远程创建分支(主)之前可能不会出现这种情况。所以看起来你需要做你提到的命令。请参阅手册
答案 2 :(得分:3)
git push
的默认行为,大概是你所描述的“将代码推送到服务器”,只是推送在你推送的遥控器上按名称具有匹配分支的本地分支至。当你创建一个新的repo时,它没有分支,所以一个简单的git push
将不会推送任何东西。您必须先按名称明确推送分支。此后,默认行为将按预期工作。
P.S。实际上,你只需要git push origin master
。它的作用是将您的本地主人推送到gitolite repo作为主人,因为您没有指定其他名称。如果您说git push origin master:foo
,那么您在本地称为“master”的分支将在gitolite上被称为“foo”。
P.P.S。您可以在“无”,“匹配”(默认),“跟踪”/“上游”和“当前”之间切换默认推送行为。请参阅git-config man page上的“push.default”设置。
答案 3 :(得分:1)
它为您设置跟踪。您可以使用此简写:
git push origin master
冒号后面的部分是远程仓库上分支的名称。如果省略它,git假定您需要相同的名称。
希望这有帮助。