TL; DR: git branch --set-upstream-to origin/solaris
Відповідь на поставлене вами запитання - яке я перефразую трохи як "чи я повинен встановити висхідний потік" - це: ні, вам взагалі не потрібно встановлювати вище.
Якщо у вас немає поточної версії для поточної гілки, Git змінює свою поведінку на git push
та інші команди.
Повна сюжетна історія тут довга і нудна і входить в історію до версії 1.5 Git. Щоб скоротити його цілком багато, git push
було реалізовано погано. 1 Станом на Git версії 2.0, Git тепер має ручку конфігурації, push.default
яку тепер написано за замовчуванням simple
. Для декількох версій Git до та після 2.0, кожного разу, коли ви бігали git push
, Git видає багато шуму, намагаючись переконати вас налаштуватись push.default
лише git push
на заткнення.
Ви не згадуєте, яку версію Git використовуєте, а також не конфігурували push.default
, тому ми мусимо здогадатися. Я припускаю, що ви використовуєте Git версії 2-точка-то, і що ви встановили push.default
для , simple
щоб змусити його замовкнути. Саме ця версія Git у вас є, і що, якщо все, що ви push.default
встановили, має значення через цю довгу і нудну історію, але, врешті-решт, той факт, що ви отримуєте ще одну скаргу від Git, означає, що ваш Git є налаштований, щоб уникнути однієї з помилок минулого.
Що таке вище за течією?
Верхній потік - це просто інша назва гілки, зазвичай це відділення дистанційного відстеження, пов'язане з (звичайною, локальною) гілкою.
Кожна гілка має можливість встановити один (1) набір потоку. Тобто кожна гілка або має висхідну, або не має висхідної. Жодна гілка не може мати більше одного вище за течією.
Верхній потік повинен , але не повинен бути дійсною гілкою (незалежно від віддаленого відстеження або локального ). Тобто, якщо нинішня гілка Вorigin/B
master
має верхню частину U , повинна працювати. Якщо він не працює - якщо він скаржиться на те, що U не існує, - більшість Git діє так, ніби вихідний потік взагалі не встановлений. Декілька команд, як-от , показуватимуть налаштування верхнього потоку, але позначають його як "пропало".git rev-parse U
git branch -vv
Що хорошого вгору за течією?
Якщо ваш параметр push.default
встановлений на simple
або upstream
, налаштування верхнього потоку змушує git push
використовуватись без додаткових аргументів, просто працювати.
Це все - це все, для чого це потрібно git push
. Але це досить важливо, оскільки git push
це одне з місць, коли простий друк викликає великі головні болі.
Якщо ти push.default
встановлений в положення nothing
, matching
або current
, встановивши вгору по течії взагалі нічого не робить все для git push
.
(Все це припускає, що версія Git принаймні 2.0.)
Вгору за течією впливає git fetch
Якщо ви git fetch
не працюєте без додаткових аргументів, Git з'ясовує якого віддаленого підключитися, проконсультувавшись із поточною гілкою вище за течією. Якщо висхідний потік є гілкою віддаленого відстеження, Git отримує з цього віддаленого. (Якщо вхідний потік не встановлений або є локальною гілкою, Git намагається отримати origin
.)
Вгору за течією впливає git merge
і git rebase
теж
Якщо ти біжиш git merge
або git rebase
не маєте додаткових аргументів, Git використовує поточну гілку потоку. Так це скорочує використання цих двох команд.
Вгору за течією впливає git pull
Ніколи не слід використовувати 2git pull
, але якщо ви це зробите, git pull
використовуйте налаштування верхнього потоку, щоб визначити, з якого віддаленого для отримання, а потім з якої гілки об'єднатись або перезавантажитись. Тобто git pull
робить те саме, що і git fetch
тому, що воно фактично працює, git fetch
і потім робить те саме, що git merge
або git rebase
, тому що воно працює git merge
або git rebase
.
(Зазвичай ви повинні просто виконати ці два кроки вручну, принаймні, поки ви не знаєте Git достатньо добре, що коли не вдасться жоден крок, який, в кінцевому підсумку, ви визнаєте, що пішло не так і знаєте, що з цим робити.)
Вгору за течією впливає git status
Це насправді може бути найважливішим. Після того, як у вас буде встановлений вихідний потік, ви git status
можете повідомити про різницю між вашою поточною філією та її верхнім потоком у перерахунку на коміти.
Якщо, як у звичайному випадку, ви знаходитесь на гілці B
з встановленим вище потоком , і ви запускаєте , ви відразу побачите, чи є у вас коміти, на які ви можете натиснути, та / або зобов’язуєтесь ви можете об'єднатись або перезавантажитись.origin/B
git status
Це тому, що git status
працює:
git rev-list --count @{u}..HEAD
: скільки комісій у вас немає, на B
які немає ?origin/B
git rev-list --count HEAD..@{u}
: скільки комісій у вас немає, на які немає ?origin/B
B
Налаштування вище за течією дає вам усе це.
Як це master
вже встановлено набір вище?
Коли ви вперше клонуєте з якогось віддаленого пристрою, використовуючи:
$ git clone git://some.host/path/to/repo.git
або аналогічний, останній крок Git робить це, по суті, git checkout master
. Це перевірка з вашого місцевого відділення master
-тільки НЕ мають місцеве відділенняmaster
.
З іншого боку, у вас дійсно є пульт дистанційного спостереження філії по імені origin/master
, тому що ви просто клонувати його.
Git передбачає , що ви повинні мати в виду: «змусити мене новий локальний , master
що вказує на те передай як віддалений-трекінг origin/master
, і, в той час як ви на нього, встановити вгору по течії для master
до origin/master
.»
Це трапляється для кожної галузі, git checkout
якої ви ще не маєте. Git створює гілку і змушує її "відстежувати" (мати як висхідний потік) відповідну гілку віддаленого відстеження.
Але це не працює для нових галузей, тобто, філій, які не мають віддаленого відстеження галузі до сих пір .
Якщо ви створили нову гілку:
$ git checkout -b solaris
є, поки що, немає origin/solaris
. Ваш локальний solaris
не може відслідковувати відділення віддаленого відстеження, origin/solaris
оскільки його немає.
Під час першого натискання нової гілки:
$ git push origin solaris
що створює solaris
на origin
, і , отже , також створює origin/solaris
в вашому власному репозиторії Git. Але вже пізно: у вас вже є локальний solaris
, у якого немає потоку . 3
Чи не повинен Git просто встановити це, як зараз, як висхідний потік автоматично?
Ймовірно. Дивіться «реалізовані погано» і виноска 1. Це важко змінити в даний час : Є мільйони 4 сценаріїв , які використовують Git і деякі цілком можуть залежати від його поточного поведінки. Зміна поведінки вимагає нового основного випуску, nag-ware, щоб змусити вас встановити якесь поле конфігурації тощо. Коротше кажучи, Гіт є жертвою власного успіху: які б помилки в ньому не було, сьогодні можна виправити лише якщо зміни є переважно невидимими, явно-набагато кращими, або робляться повільно з часом.
Справа в тому, що це не сьогодні, якщо ви не використовуєте --set-upstream
або -u
під час використання git push
. Ось що вам повідомляє повідомлення.
Вам не потрібно робити це так. Ну, як ми зазначали вище, вам зовсім не потрібно це робити, але скажімо, що ви хочете вище за течією. Ви вже створили відділення solaris
за origin
допомогою попереднього натискання, і як git branch
показує результат, ви вже є origin/solaris
у вашому локальному сховищі.
Ви просто не встановлюєте його як вихідний потік для solaris
.
Щоб встановити його зараз, а не під час першого натискання, використовуйте git branch --set-upstream-to
. --set-upstream-to
Суб-команда бере ім'я будь-якого існуючого філії, наприклад origin/solaris
, і встановлює вгору по течії поточної гілки до цієї іншої галузі.
Це все - це все, що він робить, - але це все, що було зазначено вище. Це означає, що ви можете просто бігти git fetch
, потім озирнутися, потім запустити git merge
або, git rebase
як годиться, потім зробити нові зобов’язання та запустити git push
, не купуючи додаткових метушні.
1 Щоб бути справедливим, не було ясно тоді , що первісна реалізація була схильна до помилок. Це стало зрозуміло лише тоді, коли кожен новий користувач щоразу робив однакові помилки. Зараз це "менш бідно", що не можна сказати "чудово".
2 "Ніколи" трохи не сильний, але я вважаю, що новачки в Git розуміють речі набагато краще, коли я відокремлюю кроки, особливо коли я можу показати їм, що git fetch
насправді зробив, і вони зможуть побачити, що git merge
чи git rebase
робити далі.
3 Якщо ви запускаєте перше git push
як git push -u origin solaris
—еее, якщо ви додасте -u
прапор — Git встановить origin/solaris
як верхній потік для вашої поточної гілки, якщо (і лише якщо) натискання буде успішним. Тож вам слід подати -u
з першого поштовху. Насправді, ви можете поставити його в будь-який наступний натиск, і він встановить або змінить вгору по течії в цій точці. Але я думаю git branch --set-upstream-to
, що простіше, якщо ти забув.
4 Виміряний методом Остін держав / д-р Злого методом просто сказати «один МІЛЛЛ-ЮН».