Push.default “simple” vs “current” no git para fluxo de trabalho descentralizado

121

Em termos funcionais, em um fluxo de trabalho descentralizado, não vejo a diferença entre simplee currentopções para a push.defaultconfiguração.

currentenviará a ramificação atual para uma ramificação identicamente identificada no controle remoto especificado. simpleefetivamente fará o mesmo com os controles remotos rastreados e não rastreados para a ramificação atual (ela aplicará nomes de ramificações idênticos nos dois casos).

Alguém pode explicar as diferenças importantes entre os dois para fluxos de trabalho descentralizados que estão faltando?

void.pointer
fonte
2
@ Trevor - isso não está relacionado à minha pergunta.
precisa saber é o seguinte

Respostas:

184

A diferença é que simple, com git push(sem passar um refspec) falhará se o ramo atual não estiver rastreando um ramo upstream remoto (mesmo que exista um ramo com o mesmo nome no controle remoto):

$ 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

Por outro lado, currentnão se importa se o ramo atual rastreia ou não um upstream, ele apenas deseja enviar para qualquer ramo que tenha o mesmo nome:

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

A documentação

Na documentação de configuração do Git :

  • upstream - empurre o ramo atual para o ramo upstream ...

  • simple - como upstream, mas se recusa a pressionar se o nome do ramo upstream for diferente do nome local ...

  • current - envie a ramificação atual para uma ramificação com o mesmo nome.


fonte
4
Eu acho que a única pergunta "bônus" é "por que". Eu acho que forçar um ramo de rastreamento upstream elimina erros (sobrescrevendo acidentalmente esse ramo no controle remoto errado).
precisa saber é o seguinte
7
Simples parece a opção mais segura de "cinto de segurança".
Jonathan
2
Revisitando minha própria pergunta após um longo tempo :-) Como currentsabia qual controle remoto escolher? Se você não tem um ramo de rastreamento definido, para onde ele envia?
void.pointer
2
Empurra para o controle remoto padrão -> isso significa origem. Do man git-push: Quando a linha de comandos não especifica para onde enviar com o argumento <repository>, ramifica-se a configuração remota. *. Para a ramificação atual para determinar para onde enviar. Se a configuração estiver ausente, o padrão será a origem.
precisa saber é
2
Eu sempre uso 'atual' há anos sem absolutamente nenhum problema. Na maioria dos casos, funciona: puxar / empurrar para um repo, criar novas ramificações ou verificar ramificações existentes onde os conflitos de nomes são improváveis. Apenas funciona, sem problemas. Não posso dizer que deve ser o padrão (já que é inseguro), mas graças a Deus existe.
trisweb
10

A diferença é que simpleenvia para a ramificação de rastreamento se tiver o mesmo nome, enquanto currentpassa para uma ramificação com o mesmo nome, independentemente de qualquer ramificação de rastreamento:

$ 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
fonte