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

122

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

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

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

void.pointer
источник
2
@Trevor - это никак не связано с моим вопросом.
void.pointer 07

Ответы:

185

Разница заключается в том, что с 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 - переместить текущую ветку в ветку с таким же именем.


источник
4
Думаю, единственный «бонусный» вопрос - «почему». Я предполагаю, что принудительная ветвь отслеживания восходящего потока устраняет ошибки (случайная перезапись этой ветки на неправильном пульте).
void.pointer
7
Простой кажется более безопасным вариантом «ремня безопасности».
Джонатан
2
Возвращаясь к моему собственному вопросу через долгое время :-) Как currentузнать, какой пульт выбрать? Если у вас нет установленной ветки отслеживания, куда она отправляется?
void.pointer
2
Он нажимает на пульт по умолчанию ->, что означает происхождение. От man git-push: Если в командной строке не указано, куда отправлять с аргументом <repository>, выполняется консультация с удаленной конфигурацией branch. *. Для текущей ветки, чтобы определить, куда отправлять. Если конфигурация отсутствует, по умолчанию используется origin.
reegnz
2
Я всегда использовал «текущий» в течение многих лет без каких-либо проблем. В большинстве случаев это работает: вытягивание / отправка в одно репо, создание новых веток или проверка существующих веток, где конфликты имен маловероятны. Просто работает, без проблем. Не могу сказать, что это должно быть по умолчанию (так как это небезопасно), но, слава богу, он существует.
trisweb
10

Разница в том, что 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` 
jthill
источник