Полный ответ немного длинный, но короткий ответ, основанный на вашем комментарии:
Я использовал git push origin master
означает, что вы все равно не выдвинули ничего, кроме master
, поэтому ни одно из этих других имен ветвлений не было задействовано вообще.
Длинный ответ
Стоит начать с этого: синтаксис для git push
:
git push <em>remote refspec1 refspec2 ... refspecN</em>
То есть слово origin
в вашей команде - это remote , а слово master
- это refspec (и вы использовали ровно один такой refspec, хотя вы разрешено выдвигать более одного refspec).
Аргумент remote - это просто название того, что Git называет remote , что, я допускаю, является круговым определением и не очень полезно. Но мы можем определить это на примере: origin
- это пульт, а в большинстве случаев origin
- это ваш только пульт. Так что третье слово в git push origin ...
всегда равно origin
. Единственный раз, когда вы пишете что-то другое, это если вы добавляете больше пультов, используя git remote add (нажмите на ссылку, чтобы посмотреть его документацию) .
Более интересная часть - refspec. refspec во второй простейшей форме представляет собой просто пару имен (обычно имен ветвей), разделенных двоеточием, например master:master
. Имя слева от двоеточия - ссылка на источник , а имя справа - ссылка на назначение . Если вы напишите:
git push origin master:master
вы просите, чтобы ваш Git вызвал другой Git по URL-адресу, хранящемуся под именем origin
, и ваш Git попросил, чтобы его Git установил их master
- часть :master
- так же, как вы устанавливаете свою собственную master
, master:
часть master:master
.
Я сказал, что это вторая самая простая форма, потому что самая простая форма предназначена только для написания вашего собственного имени ветви. Когда вы делаете это, Git предполагает - по крайней мере, для git push
, что вы хотите установить то же самое имя на другой стороне, так что master
является коротким для master:master
.
Если вы хотите, чтобы ваш Git попросил, чтобы его Git установил их branch-2
, вы должны указать в рефспеке что-то отличное от master
. Например, вы можете запустить:
git push origin branch-2:branch-2
попросить их Git установить branch-2
на основе вашего branch-2
. Вы можете сократить это, пропустив часть :branch-2
. Обратите внимание, что вы также можете сделать:
git push origin master:branch-2
, который просит их Git установить branch-2
на основе вашего master
, а не branch-2
!
Если вы сделаете что-либо из этого, вы найдете некоторые другие интересные аспекты git push
. В частности:
- Ваш собственный Git имеет параметр конфигурации,
push.default
, который (если ваш Git не слишком древний) по умолчанию равен simple
.
- Если ваш
push.default
установлен на simple
, Git «хочет» нажать master
на master
и branch-2
на branch-2
. (Если ваш push.default
настроен на другие значения, Git использует другие функции.)
Настройка simple
означает, что вы можете просто запустить git push
, при условии вы установите upstream для каждой из ваших ветвей.
git push
примет текущую настройку текущей ветви вверх по потоку, независимо от того, что это, и использует ее для git push
для ветви с таким же именем на соответствующем пульте.
Чтобы этот последний бит работал, вам нужно, чтобы восходящий поток имени master
был origin/master
, а восходящий поток имени branch-2
- origin/branch2
. Итак, что же такое upstream?
Верхняя настройка имени ветви
Каждая ветвь может иметь один (1) восходящий поток. Ветвь может начинаться вообще без восходящего потока. На самом деле восходящий поток состоит из двух частей по историческим причинам, но вы можете установить его с помощью:
git branch --set-upstream-to=origin/branch2 branch2
например, для установки восходящего потока branch2
на origin/branch2
.
TypicaТолько восходящий поток для любой ветви с именем X равен origin/<em>X</em>
. Параметр simple
для push.default
требует такого типа совпадающего имени, что означает, что если вы переименовываете ветку, вы также должны изменить ее восходящий поток (если он был ранее).
Существует ошибка в настройке ветки вверх по течению, особенно сразу после того, как вы только что создали ее. Вы только что создали branch-2
- ну, технически вы создали branch-1
, а затем переименовали его в branch-2
, но это равносильно тому, что Git over в origin
не имеет ответвления с именем branch-2
пока . Это означает, что ваш собственный Git еще не имеет origin/branch-2
, так как имена origin/*
вашего Git - это способ помнить, что у него есть, а у Git этого пока нет.
Что сводится к тому, что после того, как вы создаете ветку, в первый раз вы нажимаете ее, вы должны излагать полный толчок:
git push origin branch-2
например, или:
git push origin branch-2:branch-2
если вы хотите быть полностью откровенным об этом. Как только вы это сделаете , вы можете использовать git branch --set-upstream-to
:
git push origin branch-2
git branch --set-upstream-to=origin/branch-2 branch-2
поскольку шаг push
создает branch-2
в начале координат, после чего ваш Git запоминает, что его Git имеет branch-2
, создавая свой собственный origin/branch-2
. (Уф!)
Хотя для этого есть короткий путь. Вместо ввода двух команд вы можете использовать одну команду:
git push -u origin branch-2
Опция -u
здесь говорит git push
, что он должен попробовать нажать и, если это удастся, немедленно запустить git branch --set-upstream-to
для вас.
Как только вы это сделаете, branch-2
будет иметь origin/branch-2
в качестве восходящего потока, так что когда вы извлечете branch-2
, вы можете запустить:
git push
и ваши настройки simple
для вашего push.default
скажут git push
, что он должен посмотреть вверх по течению (origin/branch-2
) и использовать его для увеличения значения branch-2
до origin
* branch-2
.