Чому мені потрібно явно натиснути нову гілку?


180

Я новачок gitі практикуюсь. Я створив локальну філію, але побачив, що коли я робив, її git pushвідділення не завантажувались у сховище. Я повинен був на насправді: git push -u origin --all.
Чому це? Чи не є філія новою зміною, яку потрібно натиснути за замовчуванням? Чому мені потрібно запустити другу команду?


15
Зверніть увагу, що це налаштовується (налаштування push.default, див. man git-config). Якщо ви це зробите git config --add push.default current, то git pushавтоматично створіть гілку у віддаленому репо, якщо потрібно. Чому це не за замовчуванням, пояснюється у відповідях.
sleske

@sleske Я згоден Про інші правила " current" та " upstream" дивіться у моїй старій відповіді stackoverflow.com/a/13751847/6309 .
VonC

Чому б не прийняти відповідь?
laike9m

Відповіді:


224

Справжня причина полягає в тому, що в новому репо (git init) немає гілки (ні master, зовсім немає гілки, нульові гілки)

Отже, коли ви вперше натискаєте на порожнє репо вгору за течією (як правило, голе ), це репо вгору за течією не має гілки з такою ж назвою.

І:

В обох випадках, оскільки порожнє репо вгору за течією не має гілки:

  • ще немає відповідної названої гілки
  • взагалі немає відділення вгору за течією (з однойменною назвою або без неї! Відстеження чи ні)

Це означає, що ваш локальний перший поштовх не має поняття:

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

Тож вам потрібно принаймні зробити:

git push origin master

Але якщо ви робите лише це, ви:

  • створить masterгілку вище за течією (зараз не порожнє репо): добре.
  • не зафіксує, що локальну гілку ' master' потрібно натиснути на вгору ( origin) ' master' (гілка вище за течією): погано.

Ось чому рекомендується для першого поштовху зробити:

git push -u origin master

Це буде записано origin/masterяк відділення віддаленого відстеження , і дасть можливість наступному натисканню автоматично натиснути masterна origin/master.

git checkout master
git push

І це також буде працювати з політикою push ' current' або ' upstream'.
У кожному випадку, після початкового git push -u origin master, простого натискання git буде достатньо, щоб продовжити натискання ведучого до правої гілки вище за течією.


2
Після цього моменту наступна git pushтакож очікує, що філія вже існуватиме?
Cratylus

2
Так. Це підштовхне будь-які оновлення цієї гілки до сховища вище.
RyPeck

@Cratylus так, через нову політику натискання за замовчуванням ' simple': натисніть на будь-яку записану гілку вгору за потоком, якщо ця гілка вище за течією має те саме ім'я, що і локальна. Досить простого git push.
VonC

1
@ButtleButkus Дякую Я відновив посилання.
VonC

3
Для більш загального випадку запитувача про нову гілку "new_branch" ви б використовували git push --set-upstream origin new_branchабо git push -u origin new_branchкоротше. Те, -allщо запитувач використовував, обійшов назву конкретної нової гілки, включивши всі гілки. Про це висвітлює + Клас Мелбурн у своїй відповіді.
Пол Масрі-Стоун

106

Ні, не дивіться нижче

Мені ця функція є дуже прикрою, оскільки я не намагаюся запускати ракети до Місяця, просто натискаю на свою прокляту гілку. Ви, мабуть, так чи інакше не були б тут!

Ось виправлення: якщо ви хочете, щоб воно неявно натиснуло на поточну гілку незалежно від того, чи існує ця гілка за походженням, просто видайте цю команду один раз, і вам більше нікуди не доведеться ніколи :

git config --global push.default current

Тож якщо ви робите гілки так:

git checkout -b my-new-branch

а потім зробіть деякі зобов’язання, а потім зробіть

git push -u

щоб вивести їх на походження (перебуваючи на цій гілці), і він створить вказану гілку для вас, якщо її не існує.

Зверніть увагу, що біт -u гарантує, що вони пов’язані, якщо ви пізніше виходитимете із зазначеної гілки. Якщо ви не плануєте витягувати гілку пізніше (або добре з іншим лайнером, якщо у вас є) -у не потрібно.


3
Коли я це роблю, якщо я витягую кишку, відразу після цього - дві гілки не з’єднуються між собою. :(
Аліссо,

це єдина відповідь, яка вирішила мою проблему.
Реймонд Шенон

2
Щоб зв’язати їх, використовуйтеgit push -u
Ben Creasy

Дякую! Цю відповідь слід сприймати як швидке та «двадцять» рішення. Я впевнений, що це найближче до наміру ОП.
youngrrrr

3
> Я не намагаюся запускати ракети на Місяць. -- ТАК.
VCavallo

39

Вихід 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це те, що ти постійно робиш.

"Чи не є філія новою зміною, яку слід натиснути за замовчуванням?" Я б сказав, що "зміна" в Git - це зобов'язання. Гілка - вказівник на коміт. Для мене має сенс думати про поштовх як про щось, що підштовхує, переходить до інших сховищ. На які комітети висуваються, визначається, на якій гілці ви знаходитесь, і відношення відстеження цієї гілки до гілок на дистанційному.

Детальніше про відстеження гілок ви можете прочитати в розділі Віддалені гілки книги Pro Git .


Я не отримав, fatalале я вже здійснив зобов’язання у філії. Чи є це питання?
Cratylus

@Cratylus це не має значення. Фіксація є безпечною у вашому сховищі та git push -u originскопіювала її у віддалене сховище.
Клас Меллбурн

Ні, я маю на увазі той факт, що я не отримав fatalповідомлення, подібного до того, про яке ви згадуєте у відповіді. Чи залежить ця різниця від того, що я щось зробив у галузі?
Cratylus

@Cratylus Я не знаю, чому ви не отримали fatalповідомлення. Я б здогадався, що різниця залежить саме від того, яку саме git-реалізацію ви використовуєте. Мій вихід із 1.8.1.msysgit.1 працює на Windows 8.
Klas Mellbourn

У мене така ж версія, але на Vista
Cratylus

4

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

Ні, не кожна галузь - це те, що ти хочеш підштовхнути до зовнішнього світу. Це може бути приватним експериментом.

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


1) It might represent a private experiment.Ок, але в чому полягає велика справа? "Основна" галузь, над якою працюють всі, тобто masterне впливає. Якщо ви не маєте на увазі зберегти вихідний код прихованим 2) git push, without a remote, pushes to the current branch's remoteЯ втратив вас тут :(
Cratylus

@Cratylus: 1) У проекті з десятками розробників, які працюють у всіх відділеннях, ви отримаєте дуже брудний репост. Я працюю над такими проектами, і мені б не хотілося git fetchщороку сотні напівробочих галузей. 2) Я маю на увазі git pushповедінку за замовчуванням. Це натискає на пульт, який відстежує поточна гілка, якщо така є.
Фред Фо

3

HEAD є короткою для поточної гілки, тому HEIT працює з поштовхом -u походження. Тепер, щоб уникнути цього введення тексту кожен раз, коли я використовую псевдонім:

git config --global alias.pp 'push -u походження HEAD'

Після цього щоразу, коли я хочу натиснути гілку, створену через гіт -b гілку, я можу натиснути її за допомогою:

git pp

Сподіваюся, це економить час для когось!


2

При першій перевірці

Крок 1: git remote -v
// якщо знайдено git ініціалізувати, то видаліть або пропустіть крок 2

Крок 2: git remote rm origin
// Потім налаштуйте свою електронну адресу глобально git

Крок 3: git config --global user.email "youremail@example.com"

Крок 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


1

Я просто зазнав подальшої перестановки цього питання.

У мене була філія, названа feat/XYZ-1234-some-descriptionчерез те, що я працював над проблемою Джира 1234. Під час роботи я створив нову проблему Джира, щоб відстежувати менший твір, і коли я прийшов натиснути, я вирішив перейти до назви філії з цим новим номером номера в:

git push -u origin feat/XYZ-5678-a-different-description # failed

Це дало мені помилку, яку обговорювали в цій темі SO. Але оскільки я намагався перейти до іншої назви гілки від моєї поточної гілки, моя проблема була іншою, ніж описана тут. Я перейменував свою місцеву філію, перш ніж я міг її натиснути:

git branch -m feat/XYZ-1234-some-description feat/XYZ-5678-a-different-description
git push -u origin feat/XYZ-5678-a-different-description # now works

Трохи прочитавшись, я зрозумів, що міг би встановити srcна git push, чи то поточну назву гілки, так і просто, HEADякщо це доречно:

git push -u origin feat/XYZ-1234-some-description:feat/XYZ-5678-a-different-description # also works

-1

Якщо ви ввімкнете можливість змінити нові зміни з нової гілки вперше. І потрапляння нижче помилки:

*git push -f
fatal: The current branch Coding_Preparation has no upstream branch.

Щоб натиснути поточну гілку та встановити пульт як верхній потік, використовуйте

git push -u origin new_branch_name


** Successful Result:** 
 git push -u origin Coding_Preparation
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 599 bytes | 599.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'Coding_Preparation' on GitHub by visiting: ...
 * [new branch]      Coding_Preparation -> Coding_Preparation
Branch 'Coding_Preparation' set up to track remote branch 'Coding_Preparation' from 'origin'.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.