git - push-ток против push-upstream (отслеживание)
Я прочитал git man о команде push, но я все еще не понимаю ТОЧНОЙ разницы между током и восходящим потоком, которая должна быть установлена в push.default
Я хочу, чтобы наша команда просто делала push, и только изменения в той ветке, над которой они сейчас работают, будут перенесены. Как я понимаю, эта ветка помечена * (звездочкой), когда я делаю git ветку.
Спасибо за помощь.
2 ответа
Вопрос в том, что вы толкаете и куда:
current
:- " что " - это только ваша текущая ветка (без других веток),
- " Куда " - это ветвь с тем же именем (созданная, если она не существует) в репозитории верхнего уровня.
upstream
:- " что " тоже только текущая ветка,
- " где " означает любую ветвь (не обязательно с тем же именем) в восходящем репо , назначенную в качестве восходящей ветки для локальной ветви, которую вы отправляете.
Как объясняется здесь, Git2.0 дополнительно введет новое значение по умолчанию для push.default
: simple
simple
как upstream
, но восходящий поток также должен иметь такое же имя, иначе push не удастся.
Нажимаем только одну ветку (с режимом " simple
"," current
" или же " upstream
msgstr ") избегает сценария, в котором все соответствующие ветви перемещаются (режим" matching
", который долгое время был по умолчанию), даже если некоторые из ваших веток могут быть не готовы к отправке.
(master)> git push
...
To git@github.com:jkubicek/my_proj.git
21b430d..dd378ca master -> master
! [rejected] release -> release (non-fast-forward)
error: failed to push some refs to 'git@github.com:jkubicek/my_proj.git'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart.
hint: If you did not intend to push that branch, you may want to
hint: specify branches to push or set the 'push.default' configuration
hint: variable to 'current' or 'upstream' to push only the current branch.
Разница между двумя (current
а также upstream
) в тянет (что тянуть с пульта на свою ветку?):
толкая "
current
"не означает, что ваша текущая ветвьB
имеетremote/B
имеет свою ветвь вверх по течению.
То есть:branch.B.merge
не установлен, когда вы нажимаете "current
" ветка.
То есть: когда тянет кB
, мерзавец не будет знать, какую ветку тянуть.толкая "
upstream
"означает, что ваша текущая веткаB
имеетremote/B
имеет свою ветвь вверх по течению.
То есть:branch.B.merge
устанавливается, когда вы нажимаетеupstream
" ветка.
То есть: когда тянет кB
git знает, какую ветку потянуть (а также какую удаленную репо:branch.B.remote
)
push.default
лучше всего описан в справочной странице git config (man git config
).
Чтобы понять разницу между "восходящим" и "текущим" для push.default
Вы должны знать термин вверх по течению:
Восходящий поток - это локальный указатель от обычной локальной ветви к локальной ветви удаленного отслеживания. (Да, все они локальные.) Примеры:
- ответвление blabla имеет источник /blabla, настроенный как восходящий (очень часто)
- В ветке blabla есть origin/foo как upstream (ветка имеет другое локальное имя; не так часто встречается)
- ветвь блабла имеет origin2/foo как восходящий
Обратите внимание, что ветви origin/* являются локальными и (повторно) устанавливаются при каждой выборке из источника. Они называются "локальными ветвями удаленного слежения". Они представляют состояние веток на удаленном "источнике" во время последней выборки.
Каждая (нормальная) локальная ветвь может иметь настроенный восходящий поток, но это не обязательно: конфигурация восходящего отношения предназначена только для удобства некоторых команд git!
Если вы делаете git status
например, git сообщает вам "x фиксирует позади / впереди", если он знает восходящий поток (так что git может сравнить с ним).
Нормальный начальный git checkout blabla
обычно настраивает для вас исходную конфигурацию (если origin /blabla существует, она извлекается и настраивается как восходящая - в противном случае проверка завершится неудачно).
git push
также может использовать восходящую конфигурацию ветки, т.е. копировать ваши новые коммиты в удаленную ветвь, которая представляет восходящую ветку. (Это push.default = upstream
.)
push.default = current
позволяет git push
скопируйте новые коммиты на пульт под тем же именем. Он полностью игнорирует вышестоящую конфигурацию. - Если имя вашей локальной ветки всегда совпадает с именем удаленной, обе конфигурации имеют одинаковый эффект, за исключением того, что git push
с push.default = upstream
потерпит неудачу, если восходящий поток еще не настроен.
PD: Да, *
на выходе git branch
показывает текущую ветку.