Git - текущий ток против push upstream (отслеживание)

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

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

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

Ответ 1

Вопрос в том, что вы нажимаете и где:

  • current:

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

    • " что" также является только текущей ветвью,
    • ", где" относится к любой ветки (не обязательно с тем же именем) в восходящем репо был назначен как ветвь upstream для локальной ветки, на которую вы нажимаете.

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

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


Нажатие только одной ветки (с режимом "simple", "current" или "upstream" ) избегает сценарий где все соответствующие ветки нажаты (режим "matching", который был по умолчанию в течение длительного времени), хотя некоторые из ваших ветвей могут быть не готовы к нажатию.

(master)> git push
...
To [email protected]:jkubicek/my_proj.git
   21b430d..dd378ca  master -> master
 ! [rejected]        release -> release (non-fast-forward)
error: failed to push some refs to '[email protected]: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) находится в pull (что вытащить из пульта в вашу ветку?):

  • нажатие "current" не означает, что ваша текущая ветка B имеет remote/B свою ветку вверх.
    Т.е.: branch.B.merge не задано, когда вы нажимаете ветвь "current" .
    Т.е.: при нажатии на B, git не знает, какую ветвь тянуть.

  • нажатие "upstream" означает, что ваша текущая ветка B имеет remote/B имеет свою ветвь вверх по течению.
    Т.е.: branch.B.merge устанавливается, когда вы нажимаете ветвь "upstream" .
    Т.е.: при нажатии на B, git знает, какую ветвь тянуть (а также какое дистанционное репо: branch.B.remote)

Ответ 2

push.default лучше всего освещать на странице руководства git config (man git config).

Чтобы понять разницу между "восходящим" и "текущим" для push.default, вы должны знать термин вверх по течению:

Upstream - это локальный указатель из обычной локальной ветки в локальную ветвь удаленного отслеживания. (Да, все они локальные.) Примеры:

  • ветвь blabla имеет источник /blabla, настроенный как восходящий (очень распространенный)
  • ветвь blabla имеет начало /foo как восходящее (ветвь имеет другое локальное имя, не так часто)
  • ветка blabla имеет origin2/foo как вверх по течению

Обратите внимание, что ветки origin/* локальны и (повторно) установлены для каждого извлечения из источника. Они называются "локальными ветвями удаленного отслеживания". Они представляют состояние ветвей на удаленном "источнике" во время последней выборки.

Каждая (нормальная) локальная ветвь может иметь настроенный восходящий поток, но это необязательно: конфигурация отношения вверх по потоку предназначена только для удобства для некоторых команд git!

Если вы делаете git status, например, git сообщает вам, что "x завершает за/вперед", если он знает восходящий поток (поэтому git может сравниться с ним).

Обычный начальный git checkout blabla обычно устанавливает для вас восходящую конфигурацию (если источник /blabla существует, он проверяется и настраивается как восходящий поток - в противном случае проверка завершается с ошибкой).

git push также может использовать восходящую конфигурацию ветки, т.е. копировать новые коммиты в удаленную ветвь, которая представляет восходящий поток. (Это push.default = upstream.)

push.default = current позволяет git push копировать новое сообщение на удаленный доступ под тем же именем. Он полностью игнорирует восходящую конфигурацию. - Если ваше местное имя ветки всегда совпадает с удаленным, обе конфигурации имеют одинаковый эффект, за исключением того, что git push с push.default = upstream не будет работать, если восходящий поток еще не настроен.

PD: Да, * на выходе git branch показывает текущую ветку.