git - push-ток против push-upstream (отслеживание)

Я прочитал git man о команде push, но я все еще не понимаю ТОЧНОЙ разницы между током и восходящим потоком, которая должна быть установлена ​​в push.default

Я хочу, чтобы наша команда просто делала push, и только изменения в той ветке, над которой они сейчас работают, будут перенесены. Как я понимаю, эта ветка помечена * (звездочкой), когда я делаю git ветку.

Спасибо за помощь.

2 ответа

Решение

Вопрос в том, что вы толкаете и куда:

  • current:

    • " что " - это только ваша текущая ветка (без других веток),
    • " Куда " - это ветвь с тем же именем (созданная, если она не существует) в репозитории верхнего уровня.
  • upstream:

Как объясняется здесь, Git2.0 дополнительно введет новое значение по умолчанию для push.default: simple

simple как upstream, но восходящий поток также должен иметь такое же имя, иначе push не удастся.


Нажимаем только одну ветку (с режимом " simple "," current " или же " upstreammsgstr ") избегает сценария, в котором все соответствующие ветви перемещаются (режим" 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 показывает текущую ветку.

Другие вопросы по тегам