В чем разница между git push.default = current и push.default = upstream?

89

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

иконоборец
источник
2
разработчиков действительно раздражает их различать, поэтому вводится слово «простой», которое будет использоваться по умолчанию для git-push. на самом деле он появился в git 1.7.11
xhlwill
14
Подробнее о недавнем предупреждении git push.default is unset; its implicit value is changing in Git 2.0и о matchingvs simpleсм. Stackoverflow.com/questions/13148066/…
Нейт
iconoclaust: Я не думаю, что моя правка вообще изменила целостность вопроса, а устаревшую информацию просто нужно исправить. Зачем заставлять пользователя выполнять дополнительную работу по щелчку ссылки?
Flimm

Ответы:

72

Вы суммировали разницу в своем вопросе. upstreamотправляет в настроенную восходящую ветвь, при этом currentпредполагается, что восходящая ветвь имеет то же имя, что и текущая локальная ветвь, и отправляет на это конкретное имя. На самом деле нет причин предполагать, что восходящая ветвь отслеживания локальной ветки имеет то же имя, что и сама локальная ветка.

Например, если вы работаете в нескольких репозиториях или с множеством общих пультов разработчика, вы часто в конечном итоге отслеживаете разные ветки одной и той же ветки, такие как allen-masterили susan-master, оба из которых отслеживают masterветку в репозиториях Аллена и Сьюзан соответственно. В этом случае currentэто будет неправильная настройка, потому что эти имена веток не существуют на их пультах дистанционного управления.upstream, однако, будет работать нормально.

Более практичным примером может быть отслеживание как репозитория, так developmentи productionрепозитория. Ваш рабочий процесс может использовать разные ветки mainline для каждого, но это может сбивать с толку. Предположим, вы являетесь интегратором кода и хотите отслеживать masterветви обоих репозиториев по отдельности.

git checkout -b production --track production/master
git checkout -b development --track development/master

Теперь у вас есть две ветки, которые отслеживают соответствующие репозитории, ни одна из которых не использует masterсоглашение об именах. В названиях веток есть небольшая путаница: они явно описывают то, что отслеживают. Тем push.default = currentне менее, это не имело бы никакого смысла, поскольку ни один пульт не содержит developmentили productionветки.

Кристофер
источник
6
Вы upstreamприводите два примера того, когда предпочтительнее current. Я думаю, что это довольно очевидно, поэтому вам лучше привести пример для противоположного случая.
AndreKR 02 авг.13,
1
@AndreKR AFAIK currentлучше в случае, если вы новичок, потому что вам не нужно git configмного, особенно если вы клонировали откуда-то. currentподталкивает или создает-затем-подталкивает одноименные ветки в удаленном репо , если они еще не существуют, тогда как сразу simpleоткажется сделать это, если ветка с таким же именем еще не существует. upstreamимеет такое же поведение в этом случае, если ветвь восходящего потока не была явно установлена ​​или иным образом установлена, как указано в ответе Yawar .
Редко нуждающийся 'Где Моника'
6

current отправит текущую ветку в ветку с тем же именем в удаленном репо.

upstream переместит текущую ветвь в восходящую ветвь.

Восходящая ветвь - это ветка, которая была явно или неявно определена как восходящая по отношению к вашей текущей ветке. Это означает, что push и pull по умолчанию будут синхронизироваться с этой веткой. Восходящая ветвь может находиться в том же репо, что и сама текущая ветка. Вы можете делать интересные вещи, например настраивать локальную главную ветвь как восходящую по отношению к ветке локальной функции (темы), а также переключаться между ними.

Неявная настройка восходящего потока выполняется через branch.autosetupmergeзначение конфигурации. Вы можете найти документацию на git configстранице справки. Явная настройка восходящего потока выполняется с помощью -uпараметра git branchкоманды. Подробности см. На странице справки.

Явар
источник
Не думаю branch.autoSetupMerge, что думает так же, как -u/ --set-upstream. По крайней мере, я не вижу в документации ничего, что подразумевает, что он заставляет git push вести себя так, как если бы он был вызван -uпо умолчанию, что, как мне кажется, вы говорите. Вы можете уточнить, что вы имели в виду?
waldyrious
@waldyrious конечно; когда вы проверяете ветку удаленного отслеживания, branch.autoSetupMergeконфигурация по умолчанию создает новую локальную ветвь и устанавливает ее восходящий поток в качестве ветки удаленного отслеживания. Это неявное действие может быть выполнено явно с помощью флагов -t( --track) или -u ...( --set-upstream-to=...), которые делают то же самое, но с немного другим синтаксисом.
Yawar
1
Я вижу, что здесь произошло - поскольку этот вопрос касается git push, я (ошибочно) предположил, что вы говорите о -uварианте git push, а не о -uварианте git branch. Извините за путаницу :)
waldyrious