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

Страница руководства для 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.

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

UPDATE: Была обновлена ​​справочная страница для git -config, поэтому значения, сделанные там может быть намного понятнее.

Ответ 1

Вы обобщили разницу в своем вопросе. 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.

Ответ 2

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

upstream приведет текущую ветвь к ветке вверх по течению.

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

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