Подтвердить что ты не робот

Git Синтаксис принудительного нажатия, "-f" против "+ branch"

В чем разница между этими двумя командами git при изменении силы нажатия?

git push -f origin branch и git push origin +branch

4b9b3361

Ответ 1

Если вы только нажимаете одну ветвь, нет никакой разницы.

git push -f origin branch

и

git push origin +branch

являются точными эквивалентами. Разница возникает, когда вы нажимаете более одной ветки с одним git push. Подробнее читайте или перейдите непосредственно к Заключение для ответа.

Какая страница git-push сообщает вам

Самая основная форма git push, которая включает один или несколько refspec (ов), это

git push <repository> <refspec>...

Форма, которую должен удовлетворять аргумент <refspec>..., описана на странице git-push man:

<refspec>...

Specify what destination ref to update with what source object. The
format of a `<refspec>` parameter is an optional plus `+`, followed by
the source object `<src>`, followed by a colon `:`, followed by the
destination ref `<dst>`.

Итак, просто чтобы быть ясным, синтаксис для <refspec> равен

[+]<src>[:<dest>]

Если :<dst> опущен, будет обновлен тот же ref, что и <src>... если запись remote.<repository>.push (если есть) в вашей конфигурации Git не укажет иначе.

Далее на странице руководства git-push вы найдете

Имея необязательный ведущий +, вы можете сказать Git обновить <dst>ref, даже если он не разрешен по умолчанию (например, это не fast-forward.) Это не пытается объединить <src> в <dst>.

И еще дальше:

Обратите внимание, что --force применяется ко всем refs, которые вытолкнуты, следовательно используя его с push.default, установленным на matching или с несколькими нажатиями адресаты, настроенные с помощью remote.*.push, могут перезаписывать ссылки другим чем текущая ветвь (включая локальные ссылки, которые строго позади их удаленный аналог). Чтобы принудительно нажать только одну ветвь, используйте +перед refspec нажать (например, git push origin +master, чтобы заставить нажатие на ветвь master).

Заключение

В двух словах необязательный + дает вам более тонкий контроль, чем -f делает: если вы нажимаете несколько ссылок за один раз, + позволяет указать который из нажатых ссылок получает принудительное нажатие, тогда как --force (или -f) применяется ко всем refs, которые нажимаются.

Пример

Рассмотрим локальное репо с двумя ветвями master и develop, которое вы хотите нажать (с помощью одной команды git push) на удаленный origin.

  • git push origin master develop будет толкать обе ветки, но ни одна из них не будет принудительно нажата.

  • git push origin +master develop будет нажимать обе ветки, но только master будет принудительно нажата.

  • git push origin master +develop, наоборот, будет толкать обе ветки, но только develop будет принудительно нажат.

  • git push origin +master +develop будет принудительно нажимать обе ветки. Это точный эквивалент git push -f origin master develop.