На странице руководства для git-config перечислены эти параметры для push.default:
nothing - do not push anything.
matching - push all matching branches. All branches having the same name in both ends are considered to be matching. This is the default.
upstream - push the current branch to its upstream branch.
tracking - deprecated synonym for upstream.
current - push the current branch to a branch of the same name.
В большинстве случаев я предполагаю, что нажатие на ветвь восходящего потока ветки будет таким же, как и нажатие на ветвь с тем же именем, поскольку восходящая ветвь обычно имеет то же имя, и поскольку ветка с тем же именем ("текущая" ) обычно (или всегда по определению?) будет восходящим потоком. Так в чем разница?
ОБНОВЛЕНИЕ : страница руководства для git-config была обновлена (как и следовало ожидать), поэтому различия, сделанные там, теперь могут быть намного яснее.
git
git-branch
git-push
иконоборец
источник
источник
push.default is unset; its implicit value is changing in Git 2.0
и оmatching
vssimple
см. Stackoverflow.com/questions/13148066/…Ответы:
Вы суммировали разницу в своем вопросе.
upstream
отправляет в настроенную восходящую ветвь, при этомcurrent
предполагается, что восходящая ветвь имеет то же имя, что и текущая локальная ветвь, и отправляет на это конкретное имя. На самом деле нет причин предполагать, что восходящая ветвь отслеживания локальной ветки имеет то же имя, что и сама локальная ветка.Например, если вы работаете в нескольких репозиториях или с множеством общих пультов разработчика, вы часто в конечном итоге отслеживаете разные ветки одной и той же ветки, такие как
allen-master
илиsusan-master
, оба из которых отслеживаютmaster
ветку в репозиториях Аллена и Сьюзан соответственно. В этом случаеcurrent
это будет неправильная настройка, потому что эти имена веток не существуют на их пультах дистанционного управления.upstream
, однако, будет работать нормально.Более практичным примером может быть отслеживание как репозитория, так
development
иproduction
репозитория. Ваш рабочий процесс может использовать разные ветки mainline для каждого, но это может сбивать с толку. Предположим, вы являетесь интегратором кода и хотите отслеживатьmaster
ветви обоих репозиториев по отдельности.Теперь у вас есть две ветки, которые отслеживают соответствующие репозитории, ни одна из которых не использует
master
соглашение об именах. В названиях веток есть небольшая путаница: они явно описывают то, что отслеживают. Темpush.default = current
не менее, это не имело бы никакого смысла, поскольку ни один пульт не содержитdevelopment
илиproduction
ветки.источник
upstream
приводите два примера того, когда предпочтительнееcurrent
. Я думаю, что это довольно очевидно, поэтому вам лучше привести пример для противоположного случая.current
лучше в случае, если вы новичок, потому что вам не нужноgit config
много, особенно если вы клонировали откуда-то.current
подталкивает или создает-затем-подталкивает одноименные ветки в удаленном репо , если они еще не существуют, тогда как сразуsimple
откажется сделать это, если ветка с таким же именем еще не существует.upstream
имеет такое же поведение в этом случае, если ветвь восходящего потока не была явно установлена или иным образом установлена, как указано в ответе Yawar .current
отправит текущую ветку в ветку с тем же именем в удаленном репо.upstream
переместит текущую ветвь в восходящую ветвь.Восходящая ветвь - это ветка, которая была явно или неявно определена как восходящая по отношению к вашей текущей ветке. Это означает, что push и pull по умолчанию будут синхронизироваться с этой веткой. Восходящая ветвь может находиться в том же репо, что и сама текущая ветка. Вы можете делать интересные вещи, например настраивать локальную главную ветвь как восходящую по отношению к ветке локальной функции (темы), а также переключаться между ними.
Неявная настройка восходящего потока выполняется через
branch.autosetupmerge
значение конфигурации. Вы можете найти документацию наgit config
странице справки. Явная настройка восходящего потока выполняется с помощью-u
параметраgit branch
команды. Подробности см. На странице справки.источник
branch.autoSetupMerge
, что думает так же, как-u
/--set-upstream
. По крайней мере, я не вижу в документации ничего, что подразумевает, что он заставляет git push вести себя так, как если бы он был вызван-u
по умолчанию, что, как мне кажется, вы говорите. Вы можете уточнить, что вы имели в виду?branch.autoSetupMerge
конфигурация по умолчанию создает новую локальную ветвь и устанавливает ее восходящий поток в качестве ветки удаленного отслеживания. Это неявное действие может быть выполнено явно с помощью флагов-t
(--track
) или-u ...
(--set-upstream-to=...
), которые делают то же самое, но с немного другим синтаксисом.git push
, я (ошибочно) предположил, что вы говорите о-u
вариантеgit push
, а не о-u
вариантеgit branch
. Извините за путаницу :)