В чем разница между 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
. Подробнее см. на странице справки.