простой vs текущий push.default в git для децентрализованного рабочего процесса

С функциональной точки зрения, в децентрализованном рабочем процессе я не вижу разницы между параметрами simple и current для настройки конфигурации push.default.

current переместит текущую ветку в ветку с таким же именем на указанном удаленном компьютере. simple будет эффективно делать то же самое как для отслеживаемых, так и для любых неотслеживаемых пультов для текущей ветки (в обоих случаях он обеспечивает идентичные имена веток).

Может ли кто-нибудь объяснить какие-либо важные различия между ними для децентрализованных рабочих процессов, которые мне не хватает?


person void.pointer    schedule 28.05.2014    source источник
comment
возможный дубликат Предупреждение : push.default не установлен; его неявное значение меняется в Git 2.0   -  person Trevor Boyd Smith    schedule 07.11.2014
comment
@ Тревор - это вообще не связано с моим вопросом.   -  person void.pointer    schedule 07.11.2014


Ответы (2)


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

$ git checkout -b foo
Switched to a new branch 'foo'

$ git config push.default simple
$ git push
fatal: The current branch foo has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin foo

С другой стороны, current не волнует, отслеживает ли текущая ветвь восходящий поток, он просто хочет передать любую ветвь с таким же именем:

$ git config push.default current
$ git push
Total 0 (delta 0), reused 0 (delta 0)
To /Documents/GitHub/bare
 * [new branch]      foo-> foo

Документация

Из документации по настройке Git:

  • upstream - отправить текущую ветку в вышестоящую ветку...

  • simple - как и апстрим, но отказывается пушить, если имя апстрима отличается от локального...

  • current - отправить текущую ветку в одноименную ветку.

person Community    schedule 28.05.2014
comment
Я думаю, единственный бонусный вопрос — почему. Я предполагаю, что форсирование ветки отслеживания вверх по течению устраняет ошибки (случайная перезапись этой ветки на неправильном пульте). - person void.pointer; 14.01.2015
comment
Простой кажется более безопасным вариантом ремня безопасности. - person Jonathan; 21.04.2015
comment
Возвращаясь к своему собственному вопросу после долгого времени :-) Как current узнал, какой пульт выбрать? Если у вас нет установленной ветки отслеживания, куда она нажимает? - person void.pointer; 12.05.2017
comment
Он нажимает на пульт по умолчанию ->, что означает источник. Из man git-push: если в командной строке не указано, куда отправлять данные с помощью аргумента «репозиторий», для определения места отправки используется конфигурация branch.*.remote для текущей ветки. Если конфигурация отсутствует, по умолчанию используется источник. - person reegnz; 19.09.2017
comment
Я всегда использовал «текущий» в течение многих лет без каких-либо проблем. В большинстве случаев это работает: извлечение/перемещение в одно репо, создание новых веток или проверка существующих веток, где конфликты имен маловероятны. Просто работает, без вопросов. Не могу сказать, что это должно быть по умолчанию (поскольку это небезопасно), но, слава богу, оно существует. - person trisweb; 24.10.2017
comment
Мы используем current, потому что у нас есть восходящая ветвь, настроенная как общая ветвь, а проверенная ветвь — это ветвь, специфичная для разработчика, которая по существу доступна только для записи на сервере. То есть мы извлекаем из общей ветки и вставляем в ветку для конкретного разработчика; обычно нет необходимости извлекать из ветки для конкретного разработчика. Это позволяет использовать только git pull и git push без оформления, что проще всего для наших разработчиков. - person Bob Bell; 26.03.2018

Разница в том, что simple отправляет в свою отслеживающую ветку, если она имеет такое же имя, а current отправляет в ветку с тем же именем независимо от любой отслеживающей ветки:

$ git branch -vvv
  master 58d9fdc [origin/master: ahead 1] t1 bobo
* new    37132d3 [origin/save: ahead 1] t1 bibi   # <- tracking branch 'save'

$ git -c push.default=current push                # <- set `push.default=current`
Counting objects: 3, done.
Writing objects: 100% (3/3), 234 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /home/jthill/sandbox/20/t1
 * [new branch]      new -> new                   # <- and push creates `new` 
person jthill    schedule 28.05.2014