Push.default "simple" vs "actual" en git para flujo de trabajo descentralizado

122

Hablando funcionalmente, en un flujo de trabajo descentralizado, no veo la diferencia entre las opciones simpley la configuración de configuración.currentpush.default

currentempujará la rama actual a una rama con el mismo nombre en el control remoto especificado. simplehará efectivamente lo mismo para los controles remotos rastreados y no rastreados para la rama actual (aplica nombres de rama idénticos en ambos casos).

¿Alguien puede explicar alguna diferencia importante entre los dos para los flujos de trabajo descentralizados que me faltan?

puntero.void
fuente
2
@Trevor: eso no está relacionado en absoluto con mi pregunta.
void.pointer

Respuestas:

185

La diferencia es que con simple, git push(sin pasar una especificación de referencia) fallará si la rama actual no rastrea una rama ascendente remota (incluso si existe una rama con el mismo nombre en la remota):

$ 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 otro lado, currentno le importa si la rama actual rastrea o no un flujo ascendente, solo quiere empujar a cualquier rama que tenga el mismo nombre:

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

La documentación

De la documentación de configuración de Git :

  • upstream - empujar la rama actual a su rama ascendente ...

  • simple - como upstream, pero se niega a presionar si el nombre de la rama upstream es diferente del local ...

  • current - empujar la rama actual a una rama del mismo nombre.


fuente
4
Supongo que la única pregunta de "bonificación" es "por qué". Supongo que forzar una rama de seguimiento ascendente elimina los errores (sobrescribir accidentalmente esa rama en el control remoto incorrecto).
void.pointer
7
Simple parece la opción más segura de "cinturón de seguridad".
Jonathan
2
Revisando mi propia pregunta después de mucho tiempo :-) ¿Cómo currentsupe qué control remoto elegir? Si no tiene una rama de seguimiento configurada, ¿hacia dónde empuja?
puntero.void
2
Empuja al control remoto predeterminado -> eso significa origen. De man git-push: Cuando la línea de comando no especifica dónde empujar con el argumento <repository>, se consulta la configuración remota branch. *. Para la rama actual para determinar dónde empujar. Si falta la configuración, el valor predeterminado es el origen.
reegnz
2
Siempre he usado 'actual' durante años sin ningún problema. En la mayoría de los casos, funciona: tirando / empujando a un repositorio, creando nuevas ramas o revisando las ramas existentes donde los conflictos de nombres son poco probables. Simplemente funciona, sin problemas. No puedo decir que debería ser el predeterminado (ya que no es seguro) pero gracias a Dios existe.
trisweb
10

La diferencia es que simpleempuja a su rama de seguimiento si tiene el mismo nombre, mientras currentque empuja a una rama del mismo nombre independientemente de cualquier rama de seguimiento:

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