Почему мне нужно явно нажать новую ветку?

Я новичок вgit и я тренируюсь Я создал местный филиал, но увидел, что когдаgit push моя ветка не была загружена в хранилище. Я должен был сделать:git push -u origin --all

Почему это? Isn»ветка новое изменение, которое будет выдвинуто по умолчанию? Почему мне нужно запустить вторую команду?

 sleske13 июн. 2013 г., 23:31
Обратите внимание, что это настраивается (настройкаpush.default, увидетьman git-config). Если вы делаетеgit config --add push.default current, затемgit push при необходимости автоматически создаст ветку в удаленном репо. Почему это не по умолчанию объясняется в ответах.
 VonC13 июн. 2013 г., 23:46
@Sleske Я согласен. Для других политикcurrent а также ''upstreamсмотри мой старый ответstackoverflow.com/a/13751847/6309.
 laike9m10 окт. 2014 г., 09:57
Почему бы не принять ответ?

Ответы на вопрос(6)

HEAD - это сокращение от текущей ветви, поэтому git push -u origin HEAD работает. Теперь, чтобы избежать этой типизации каждый раз, когда я использую псевдоним:

git config --global alias.pp 'push -u origin HEAD '

После этого, каждый раз, когда я хочу отправить ветку, созданную через ветку git -b, я могу нажать ее, используя:

мерзавец пп

Надеюсь, это сэкономит время для кого-то!

При первой проверке

Шаг 1:git remote -v

// если найден git initialize, то удалить или пропустить шаг-2

Шаг 2:git remote rm origin

// Затем настройте ваш адрес электронной почты глобально git

Шаг 3:git config --global user.email "[email protected]"

Шаг 4:git initial

Шаг 5:git commit -m "Initial Project"

// Если вы уже добавили репозиторий проекта, пропустите шаг 6

Шаг 6:git remote add origin %repo link from bitbucket.org%

Шаг 7:git push -u origin master

Выход изgit push при нажатии на новую ветку

> git checkout -b new_branch
Switched to a new branch 'new_branch'
> git push
fatal: The current branch new_branch has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin new_branch

Простоgit push Предполагается, что уже существует удаленная ветвь, которую отслеживает текущая локальная ветвь. Если такой удаленной ветви не существует, и вы хотите ее создать, вы должны указать это с помощью-u (краткая форма--set-upstream) флаг.

Почему это так? Я предполагаю, что разработчики чувствовали, что создание ветки на удаленном компьютере является таким важным действием, но это должно быть трудно сделать по ошибке.git push это то, что вы делаете все время ".

Isn»ветвь новое изменение, которое будет выдвинуто по умолчанию? " Я бы сказал, что "перемена" в Git это коммит. Ветвь - это указатель на коммит. Для меня имеет больше смысла думать о push как о чем-то, что подталкивает коммиты в другие репозитории. То, какие коммиты отправляются, определяется тем, в какой ветке вы находитесь, и отношениями отслеживания этой ветви к удаленным веткам.

Подробнее об отслеживании веток вы можете прочитать вРаздел «Удаленные ветки» книги Pro Git.

 Klas Mellbourn13 июн. 2013 г., 22:42
@Cratylus Я получаюfatal сообщение, даже если я сделаю коммит.
 Cratylus13 июн. 2013 г., 22:32
Я не получилfatal но я уже сделал коммит в ветке. Это имеет значение?
 Klas Mellbourn13 июн. 2013 г., 22:35
@Cratylus нет, это не имеет значения. Коммит безопасен в вашем хранилище, аgit push -u origin скопировал его в удаленный репозиторий.
 Cratylus13 июн. 2013 г., 22:40
У меня такая же версия, но на Vista
 Cratylus13 июн. 2013 г., 22:36
Нет, я имею в виду тот факт, что я не получилfatal msg, как тот, который вы упомянули в ответе. Разве эта разница зависит от того, что я передал что-то в ветку?
 Cratylus13 июн. 2013 г., 22:50
Хорошо. Но почему это не так?fatal
 Cratylus13 июн. 2013 г., 22:46
Если яcheckout -b name и зафиксировать файл мойHEAD вname.Если я сделаюgit push Я получил:warning: push.default is unset; its implicit value is changing in Git 2.0 from 'matching' to 'simple'. To squelch this message and maintain the current behavior after the default changes, use: etc а потомEverything up-to-date
 Klas Mellbourn13 июн. 2013 г., 22:38
@Cratylus, я нене знаю, почему вы не получилиfatal сообщение. Я предполагаю, что разница зависит от того, какую именно реализацию git вы используете. Мой вывод из 1.8.1.msysgit.1 работает на Windows 8.
 Klas Mellbourn13 июн. 2013 г., 22:49
@Cratylus Вы можете избежать этого сообщения, выполнивgit config --global push.default simple, Причина, по которой вы получилиEverything up-to-date должно быть, что там уже былname филиал на пульте, который теперь отслеживается вашим местнымname ветка.
 Klas Mellbourn13 июн. 2013 г., 22:51

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

Нет, не каждая отрасль - это то, что вы хотите подтолкнуть во внешний мир. Это может быть частный эксперимент.

Кроме того, где следуетgit push отправить все ветки? Git может работать с несколькими пультами, и вы можете захотеть иметь разные наборы веток на каждом. Например. центральный проект GitHub repo может иметь ветки релизов; у ветки GitHub могут быть ветки тем для обзора; и локальный сервер Git может иметь ветви, содержащие локальную конфигурацию. Еслиgit push подтолкнет все ветви к пульту, который отслеживает текущая ветвь, такую схему легко испортить.

 Cratylus13 июн. 2013 г., 22:43
1)It might represent a private experimentХорошо, но в чем дело? "главный" ветка, в которой все работают, т.е.master не влияет. Если вы не хотите скрыть исходный код 2)git push, without a remote, pushes to the current branch's remote Я потерял тебя здесь :(
 Fred Foo13 июн. 2013 г., 22:49
@Cratylus: 1) в проекте с десятками разработчиков, которые все разветвляют ad lib, выВы получите очень грязные репо. Я работаю над такими проектами, и я бы нене хочуgit fetch сотни наполовину работающих веток каждый раз. 2) яЯ имею в видуgit pushповедение по умолчанию. Это подталкивает к удаленному, что текущая ветвь отслеживает, если таковые имеются.

Ты нет, см ниже

Я нахожу этоособенность' довольно раздражает, так как яЯ не пытаюсь запустить ракеты на Луну, просто толкни мою чертову ветку. Вы, вероятно, тоже так или иначе вы бы нене быть здесь!

Вот исправление: если вы хотите, чтобы он неявно выдвигал текущую ветку независимо от того, существует ли эта ветвь в источнике, просто выполните эту команду один раз, и выникогда придется снова куда угодно

git config --global push.default current

Так что, если вы делаете ветки, как это:

git checkout -b my-new-branch

а затем сделать некоторые коммиты, а затем сделать

git push -u

чтобы доставить их к источнику (находящемуся в этой ветке), и он создаст для вас указанную ветку, если это не такне существует.

Обратите внимание, что бит -u гарантирует, что они связаны, если позже вы извлечете их из указанной ветви. Если вы не планируете тянуть ветку позже (или у вас все в порядке с другим лайнером, если вы это делаете) - u не требуется.

 youngrrrr20 июл. 2018 г., 01:06
Спасибо! Этот ответ должен быть принят как быстрый и ...грязный» решение. Я'я уверен, что этоближе всего к тому, что OP 'намерение.> Я
 Ben Creasy28 окт. 2017 г., 03:06
Чтобы связать их, используйтеgit push -u
 VCavallo05 мар. 2019 г., 00:00
Я не пытаюсь запустить ракеты на Луну. -- ДА.
 Raymond Chenon18 мая 2017 г., 11:34
это единственный ответ, который решил мою проблему.
 Alisso26 янв. 2016 г., 11:23
Когда я делаю это, если я делаю git pull, сразу же после - две ветви нет связаны. :(
Решение Вопроса

Фактическая причина в том, что в новом репо (git init)нет ветви (нетmasterветки нет, ветки ноль)

Поэтому, когда вы толкаете в первый разпустой репо (как правило,голый), что репозиторий не имеет одноименной ветви.

А также:

политика push по умолчанию была ''matching (нажмите на все ветви с тем же именем, создавая их, если они нене существует),политика push по умолчаниюсейчас ''simple (нажмите только текущую ветку, и только если она имеет аналогичное имяветка удаленного слежения вверх по течению,начиная с мерзавца 1.7.11)

В обоих случаях, поскольку обратное пустое хранилище не имеет ветки:

пока нет соответствующей именованной ветвинет восходящей ветки вообще (с тем же именем или без него! Отслеживание или нет)

Это означает, что ваш местныйпервый толчок понятия не имеет:

куда толкатьчто нажать (так как он не может найти какую-либо ветку восходящего потока, либо записанную как удаленную ветвь отслеживания, и / или имеющую то же имя)

Так что вам нужно хотя бы сделать:

git push origin master

Но если вы делаете только это, вы:

создаст вверх по течениюmaster ветка в восходящем потоке (сейчас не пустой репо): хорошо.не будетзапись что местное отделениеmaster нужно подтолкнуть вверх по течению () ''originmaster (ветка вверх по течению): плохо.

Вот почему рекомендуется для первого нажатия:

git push -u origin master

Это будет записыватьorigin/master какветка удаленного слеженияи включит следующее нажатие для автоматического нажатияmaster кorigin/master

git checkout master
git push

И это тоже будет работать с политикой push ''current или же ''.upstream

В каждом случае после первоначальногоgit push -u origin masterпростого git push будет достаточно, чтобы продолжить толкать master в правую ветку upstream.

 Buttle Butkus12 нояб. 2015 г., 23:12
@ VonC ссылка говорит, что это неПодать заявку на Git выше v1.7. Можно ли использовать репозиторий non-bare с Git 2.3?
 Buttle Butkus12 нояб. 2015 г., 20:46
Ссылка на концепциюголые» репо сломано.
 faizal23 нояб. 2014 г., 06:50
Предположим, я использовалgit push origin master в первый раз, как я могу впоследствии отметитьorigin/master как удаленное отслеживание ветки? Могу ли я все еще использоватьgit push -u origin master когда удаленная ветвь уже существует и была передана раньше?
 Paul Masri-Stone14 дек. 2015 г., 16:53
Для спрашивающегоБолее общий случай новой веткиnew_branch», вы бы использовалиgit push --set-upstream origin new_branch или жеgit push -u origin new_branch коротко.-all что опрашивающий использовал обойденное наименование конкретной новой ветви, включая все ветви. Это покрыто + Klas Mellbourn в его ответе.
 VonC12 нояб. 2015 г., 23:14
@ButtleButkus Git 2.3 на самом деле в порядке: смотритеstackoverflow.com/a/28381311/6309
 GhostRider23 апр. 2015 г., 19:43
Это мне очень помогло
 VonC12 нояб. 2015 г., 22:21
@ButtleButkus Спасибо. Я восстановил ссылку.
 tanius15 янв. 2015 г., 02:53
Как запомнить это решение: просто следуйте полезному выводу git после неудачногоgit push, Предлагаетgit push --set-upstream origin master, которая является длинной версией для.git push -u origin master
 RyPeck13 июн. 2013 г., 23:30
Да. Он будет отправлять любые обновления в эту ветку в репозиторий верхнего уровня.
 Cratylus13 июн. 2013 г., 23:29
После этого момента следующийgit push также ожидает, что ветвь уже существует?
 VonC13 июн. 2013 г., 23:38
@Cratylus да, из-за новой политики push по умолчанию ''simple: нажать на любую записанную ветку восходящего потока,если эта ветка upstream имеет то же имя, что и локальная. Простоgit push будет достаточно.

Ваш ответ на вопрос