git push origin master: refs /heads / master что это делает - PullRequest
14 голосов
/ 22 сентября 2011

Когда я создаю новый репо в своем репозитории gitolite, мне всегда нужно ввести следующую команду, прежде чем я смогу начать отправку кода на сервер.?

Я предполагаю, что это связано с указанием головы, не уверен.Может ли кто-нибудь объяснить мне это?

Ответы [ 4 ]

28 голосов
/ 22 сентября 2011

Эта команда состоит из трех частей:

git push

Это вызывает команду push

origin

Это название пульта, на который вы нажимаете. Это либо один из именованных пультов, хранящихся в .git / config (вы можете перечислить их с помощью git remote), либо URL-адрес, либо токен ., который означает текущий репозиторий.

master:refs/heads/master

Это называется "refspec", и вы можете прочитать об этом на странице справки для git push. Но в целом он состоит из двух частей, разделенных двоеточием. Первая часть - это имя локальной ветви, а вторая - имя ветви в удаленном хранилище (в данном случае origin). Этот конкретный refspec может быть сокращен до master:master.

В общем, можно сократить рефэкспецс еще дальше. Простое указание master в качестве refspec эквивалентно использованию того же имени на пульте, поэтому master совпадает с master:master.

5 голосов
/ 22 сентября 2011

master:refs/heads/master является ссылкой.

refspecs имеют форму +<src>:<dst>

Таким образом, здесь master - это ссылка на локальный репозиторий, которую вы отправляете на refs/heads/master refspec на удаленном сервере (источник). master это сокращение от refs/heads/master на самом деле.

На самом деле, вы можете просто сделать git push origin master, в результате чего он переведет мастер на вашем локальном компьютере на мастер на удаленном. Только когда вы хотите перейти к другой ссылке, вам нужно явно указать пункт назначения.

Также просто git push имеет поведение по умолчанию, что, вероятно, было бы не так до того, как вы сделали первый push и создали ветку (master) на пульте. Таким образом, казалось бы, вам нужно выполнить команду, которую вы упомянули. Обратитесь к руководству

3 голосов
/ 22 сентября 2011

Поведение по умолчанию git push, которое, по-видимому, вы описываете как «отправка кода на сервер», заключается в том, чтобы отправлять только локальные ветви, которые имеют совпадающую ветвь, по имени, на удаленный узел, на который вы нажимаете. Когда вы создаете новый репо, в нем нет веток, поэтому простой git push ничего не выдвинет. Вы должны явно нажать ветку по имени в первую очередь. После этого поведение по умолчанию будет работать так, как вы ожидаете.

P.S. На самом деле, вам нужно всего лишь git push origin master. Что он делает, это подталкивает вашего локального мастера в репозиторий gitolite как мастер, поскольку вы не указали другое имя. Если бы вы сказали git push origin master:foo, то ветвь, которую вы локально называете "master", будет известна как "foo" на gitolite.

P.P.S. Вы можете переключать поведение push по умолчанию между «none», «match» (по умолчанию), «trackings» / «upstream» и «current». См. Настройки для «push.default» на справочной странице git-config .

1 голос
/ 22 сентября 2011

Он настраивает отслеживание для вас. Вы можете использовать сокращение для этого:

git push origin master

Часть после двоеточия - это имя ветви в удаленном репо. Если вы пропустите это, git предполагает, что вы хотите иметь то же имя.

Надеюсь, это поможет.

...