Давайте рассмотрим это в двух частях.
git push
и восходящие потоки
Первое: git push
без дополнительных аргументов будет (обычно - в зависимости от настроек, которые я выиграл)здесь), смотрит на восходящий параметр текущей ветви .
Если в текущей ветви нет восходящего потока, вы получите:
fatal: The current branch <branch> has no upstream branch.
(с последующим настраиваемым советом по использованию git push --set-upstream
; если вы настроите его, вы не получите совет).
Если есть восходящий поток, вы не получите эту ошибку. Это все, что есть на самом деле. Если равен восходящему набору, git push
не скажет вам установить его. Если нет, то это выдаст вам ошибку, и (если вы не настроили рекомендации) предложите установить ее.
Second, git push
с дополнительными аргументами ведет себя по-другому. Редактировать: следующий бит был неправильным. Ключевым дополнительным аргументом здесь был аргумент github
. См. jthill's answer для подробностей. Я оставил остальные в зачеркнутом, потому что они могут применяться и в некоторых ситуациях.
Но вы не запускали:
git push github
Вы на самом делеrun:
git push github master1
(Проверьте историю команд.) Если вы укажете аргумент refspec , который выполняет эта команда из четырех слов git push
, refspec предоставляет имена веток - и то, что используется локально, и то, которое ваш Git запрашивает, чтобы их Git установил. Нет необходимости ни в текущей ветви, ни в каких-либо восходящих настройках каких-либо ветвей.
git branch
или git checkout -b
и восходящие потоки
Оба git branch
и git checkout
создать новые имена ветвей.
Имя ветви может иметь восходящий набор или не быть установленным.
Поэтому, когда git branch
или git checkout
создает новое имя ветви, они имеют опция установки восходящего потока.
Их фактическое поведение настраивается с использованием branch.autoSetupMerge
и branch.autoSetupRebase
. Их поведение по умолчанию , однако, таково:
- Если вы не указали начальный коммит, используйте
HEAD
в качестве начального коммита при создании новой ветви и выполнитене устанавливать восходящий поток. - Если вы делаете предоставляете начальный коммит, проверьте форму предоставленного аргумента:
- Если он имеет форму имени удаленного отслеживания- что подразумевает как имя удаленного узла, так и имя ветви, как видно на этом удаленном элементе - установить восходящий поток.
- В противном случае не устанавливать восходящий поток.
Поскольку git branch master1
не предоставляет начальную фиксацию, новое имя создается с использованием хэш-идентификатора, в который разрешается HEAD
, и не имеет восходящего потока. Следовательно, ваш git branch -vv
не показывал восходящий набор.
Настройки усложняют ситуацию
Точные детали всех возможных взаимодействий между всеми различными настройками (push.default
, remote.<name>.push
идругие) могут связываться со всем этим. Я упоминаю об этом прежде всего потому, что вы упомянули, что вы не установили ни одного из них. Если вы это сделаете, некоторые или все вышеперечисленное может быть признано недействительным. Документация Git охватывает некоторые, но не все возможные комбинации.
Там, где говорится, что некоторая комбинация должна вести себя определенным образом, она должна вести себя таким образом. В противном случае, он может вести себя так, как чувствовал Git-кодер для них. Будьте внимательны при настройке параметров: некоторые комбинации, вероятно, никогда не тестировались.