Вопрос по git-branch, git-push, git – В чем разница между git push.default = current и push.default = upstream?

84

Страница man для 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.

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

UPDATE: Страница man для git-config был обновлен (как и следовало ожидать), поэтому различия сделанытам может быть, намного яснее сейчас.

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

Ваш Ответ

2   ответа
70

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

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

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

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

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

@AndreKR AFAIKcurrent лучше в том случае, если вы являетесь новым разработчиком, потому что вам не нужноgit config особенно если вы откуда-то клонировали.current толкает или создает, а затем толкает к одноименным веткам в удаленном репоfor you если они уже не существуют, тогда какsimple откажется делать это сразу, если ветка с таким же именем еще не существует.upstream имеет такое же поведение в этом случае, если восходящая ветвь не была явно установлена или установлена иным образом, как указано вYawarответ.
Вы даете два примера, когдаupstream предпочтительнееcurrent, Я думаю, что это довольно очевидно, поэтому вам лучше привести пример для противоположного случая.
6

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

upstream подтолкнет текущую ветвь к восходящей ветке.

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

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

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

Похожие вопросы