Git - В чем разница между «соответствием» и «простым» push.default


285

Я уже давно пользуюсь git, но мне никогда не приходилось настраивать новое удаленное репо, и мне было любопытно сделать это. Я читал учебные пособия, и я не понимаю, как заставить работать «git push».

Если я просто использую git pushего, то просит посмотреть ветку по умолчанию (?), Чтобы указать на? В чем разница между этими двумя вариантами?

git config --global push.default matching
git config --global push.default simple

Совпадение просто выдвигает любые ветви, которые у меня есть, в моем локальном репо, и если они не совпадают, я должен вручную сказать ему, чтобы подтолкнуть все новые локальные ветки, которые у меня есть, правильно? Это лучшая практика для использования или просто лучше?



1
Теперь, если только pull.defaultдоступно обновление всех этих веток локально
Nogurenn

Ответы:


368

git push может выдвинуть все ветви или одну ветку в зависимости от этой конфигурации:

Нажмите на все ветви

git config --global push.default matching

Это подтолкнет все ветви к удаленной ветви и объединит их. Если вы не хотите выдвигать все ветви, вы можете нажать только текущую ветку.

Нажмите только текущую ветку

git config --global push.default simple

Так что, на мой взгляд, лучше использовать эту опцию и продвигать код по веткам. Лучше подталкивать ветки вручную и индивидуально.


16
Мне понравился push.default currentответ от @UpAndAdam. Не знал об этом.
alanjds

4
Обратите внимание, что simpleбольше не вариант. В 1.7.8.4(и раньше?) Это приводит к ошибке при попытке нажать. но currentвсе еще доступен
sixty4bit

@ sixty4bit: я использую git версии 1.7.1. Я использую tracking-> подтолкнуть текущую ветвь к восходящей ветви.
Кевинарпе

@ sixty4bit Нет, он был включен в более позднюю версию Git, в которой я не знаю, в какой, но (1.7), чертовски стар, даже на 2016 год. Я бы вообще не рекомендовал использовать такие старые версии.
Шмуди

Downvoted. Извините, но описание на связанной странице simpleне имеет смысла, противоречит этому ответу и является неправильным - что делает этот ответ запутанным. На связанной странице написано simple«будет выдвигать ветви одну за другой. В основном связаны с текущей веткой». Означает ли это, что он будет толкать ветви последовательно, а не параллельно? Что означает «в основном связаны»? Затем описание simpleидет на процитировать описание matching, которое можно было бы подумать означает описание для matchingтакже относится simple. Но очевидно, что это не так.
tvanc

91

Из документации GIT: Git Docs

Ниже дается полная информация. Короче говоря, simpleтолько нажмите current working branchи даже тогда, только если он также имеет то же имя на пульте. Это очень хорошая настройка для начинающих и станет по умолчанию вGIT 2.0

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

В моем личном использовании я обычно использую другую опцию: currentкоторая выдвигает текущую рабочую ветвь (потому что я всегда ветвлюсь для любых изменений). Но для начинающего я бы предложилsimple

push.default
Определяет действие, которое должен выполнить git push, если явно не указан refspec. Различные значения хорошо подходят для конкретных рабочих процессов; например, в чисто центральном рабочем процессе (т. е. источник выборки равен месту назначения push), вероятно, вам нужен восходящий поток. Возможные значения:

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

current - нажать текущую ветку, чтобы обновить ветку с тем же именем на принимающей стороне. Работает как в центральном, так и не центральном рабочих процессах.

upstream - верните текущую ветвь обратно в ветку, изменения которой обычно интегрированы в текущую ветку (которая называется @ {upstream}). Этот режим имеет смысл, только если вы отправляете в тот же репозиторий, из которого вы обычно извлекаете (то есть центральный рабочий процесс).

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

При нажатии на пульт, отличный от того, с которого вы обычно тянете, работайте как ток. Это самый безопасный вариант и подходит для начинающих.

Этот режим станет стандартным в Git 2.0.

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

Чтобы эффективно использовать этот режим, вы должны убедиться, что все ветви, которые вы выдвинули, готовы к выталкиванию, прежде чем запускать git push, поскольку весь смысл этого режима заключается в том, чтобы позволить вам выталкивать все ветви за один раз. Если вы обычно заканчиваете работу только с одной веткой и выталкиваете результат, в то время как другие ветки не завершены, этот режим не для вас. Также этот режим не подходит для отправки в общий центральный репозиторий, так как другие люди могут добавлять туда новые ветви или обновлять подсказки существующих ветвей вне вашего контроля.

В настоящее время это значение по умолчанию, но Git 2.0 изменит значение по умолчанию на простое.


да, но я предполагаю даже с установкой push.default, что если вы выполните "$ git push origin master ", он будет только толкать текущую ветку к источнику в ветку с источником с тем же именем ... верно? Вы должны упомянуть, что есть также пульт по умолчанию
Александр Миллс

1
Я не уверен, что понимаю, к чему вы клоните. В ЛЮБОМ РЕЖИМЕ, если вы говорите, git push origin masterон будет делать то же самое. Суть режимов и значений по умолчанию, как правило, заключается в том, что происходит, когда вы просто говорите, git pushа не говорите об этом удаленно или ветви. Какая настройка по умолчанию? Вы имеете в виду настройку по умолчанию для push.default? настройка по умолчанию, в которой версия git ... если вы не получили его, ваш комментарий очень расплывчатый.
UpAndAdam

'push.default Определяет действие, которое должен выполнить git push, если явно не задан refspec', если вы говорите git push origin master, вы даете ему больше информации, и он все равно может не выполнять то, что вы описываете; в зависимости от настроенной вами спецификации. git-scm.com/book/en/v2/Git-Internals-The-Refspec
UpAndAdam

2

Примечания к выпуску Git v2.0

Примечания обратной совместимости

Когда git push [$there]не говорится, что нажать, мы до сих пор использовали традиционную семантику «соответствия» (все ваши ветви были отправлены на удаленный сервер, если там уже есть ветви с одинаковыми именами). В Git 2.0 по умолчанию теперь используется «простая» семантика, которая выдвигает:

  • только текущая ветвь к ветке с тем же именем, и только если текущая ветвь настроена на интеграцию с этой удаленной ветвью, если вы отправляете на тот же самый удаленный, из которого вы выбираете; или

  • только текущая ветка на ветку с тем же именем, если вы отправляете на удаленный, который не там, где вы обычно выбираете.

Вы можете использовать переменную конфигурации "push.default", чтобы изменить это. Если вы старый таймер, который хочет продолжать использовать семантику «соответствия», вы можете, например, установить для переменной «соответствие». Прочитайте документацию для других возможностей.

Когда git add -uи git add -Aвыполняются внутри подкаталога без указания путей для добавления в командной строке, они работают со всем деревом для согласованности с git commit -aдругими командами (эти команды используются только для текущего подкаталога). Скажите git add -u .или, git add -A .если вы хотите ограничить операцию для текущего каталога.

git add <path>то же самое, что и git add -A <path>сейчас, так что git add dir/он обнаружит пути, которые вы удалили из каталога, и запишет удаление. В более старых версиях Git git add <path>использовался для игнорирования удалений. Вы можете сказать git add --ignore-removal <path>добавить только добавленные или измененные пути <path>, если вы действительно этого хотите.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.