git push не просит установить upstream, хотя upstream не установлен - PullRequest
0 голосов
/ 12 октября 2019

У меня есть master ветвь, и у меня установлены следующие конфигурации.

branch.master.remote=github
branch.master.merge=refs/heads/master
push.default=simple

Теперь я хотел проверить поведение push.default. Я сделал

git branch master1 // This created a new branch on same commit as master
git checkout master1
git push github

Теперь, так как моя локальная ветвь называется master1, и это новая ветка, для нее не установлено никакого восходящего потока. Почему git push github не показывал мне сообщение об ошибке использования флага --set-upstream? Также успешно создан филиал master1 на удаленном репо. Кроме того, я не вижу удаленной ветви отслеживания с ней при запуске git branch -vv

  master  42f18f8 [github/master] Some message
  master1 42f18f8 Some message

Однако, если я только что сделал git push, находясь в master1 ветви, то он запрашивает --set-upstream.

Кроме того, у меня не установлено remote.github.push или remote.master1.push.

Ответы [ 2 ]

1 голос
/ 12 октября 2019

Я думаю, что вы пропустили второй абзац simple документов:

При нажатии на пульт, отличный от того, с которого вы обычно тянете, работайте как ток. Это самый безопасный вариант и подходит для начинающих.

, и вы нажимаете на пульт, который не является тем, с которого вы обычно тянете. Таким образом, он работает как «текущий», «нажмите текущую ветвь, чтобы обновить ветку с тем же именем на принимающей стороне».

Git пытается избежать того, чтобы новички наносили непреднамеренный ущерб, оставаясь при этом максимально полезным, точното, что должно быть разрешено или предотвращено по умолчанию, всегда будет немного смущающим, потому что ошибки новичка тоже.

0 голосов
/ 12 октября 2019

Давайте рассмотрим это в двух частях.

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-кодер для них. Будьте внимательны при настройке параметров: некоторые комбинации, вероятно, никогда не тестировались.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...