Push.default «simple» ou «actuel» dans git pour un flux de travail décentralisé

122

Sur le plan fonctionnel, dans un flux de travail décentralisé, je ne vois pas la différence entre simpleet les currentoptions de push.defaultconfiguration de la configuration.

currentpoussera la branche actuelle vers une branche de nom identique sur la télécommande spécifiée. simplefera effectivement la même chose aussi bien pour les télécommandes suivies que pour les télécommandes non suivies pour la branche actuelle (elle applique des noms de branche identiques dans les deux cas).

Quelqu'un peut-il expliquer les différences importantes entre les deux pour les flux de travail décentralisés qui me manquent?

void.pointer
la source
2
@Trevor - ce n'est pas du tout lié à ma question.
void.pointer

Réponses:

185

La différence est qu'avec simple, git push(sans passer une refspec) échouera si la branche actuelle ne suit pas une branche amont distante (même si une branche avec le même nom existe sur la télécommande):

$ 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

D'autre part, current ne se soucie pas de savoir si la branche actuelle suit ou non un amont, elle veut juste pousser vers n'importe quelle branche qui porte le même nom:

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

La documentation

À partir de la documentation de configuration de Git :

  • upstream - pousser la branche courante vers sa branche amont ...

  • simple - comme en amont, mais refuse de pousser si le nom de la branche amont est différent de celui local ...

  • current - pousser la branche actuelle vers une branche du même nom.


la source
4
Je suppose que la seule question "bonus" est "pourquoi". Je suppose que forcer une branche de suivi en amont élimine les erreurs (écraser accidentellement cette branche sur la mauvaise télécommande).
void.pointer
7
Simple semble l'option «ceinture de sécurité» la plus sûre.
Jonathan
2
Revisitant ma propre question après un long moment :-) Comment avez-vous currentsu quelle télécommande choisir? Si vous n'avez pas de branche de suivi, vers où va-t-elle?
void.pointer
2
Il pousse vers la télécommande par défaut -> cela signifie l'origine. De man git-push: Lorsque la ligne de commande ne spécifie pas où pousser avec l'argument <repository>, la configuration branch. *. Remote pour la branche actuelle est consultée pour déterminer où pousser. Si la configuration est manquante, elle est par défaut d'origine.
reegnz
2
J'ai toujours utilisé «courant» pendant des années sans aucun problème. Dans la plupart des cas, cela fonctionne: tirer / pousser vers un référentiel, créer de nouvelles branches ou extraire des branches existantes où les conflits de noms sont peu probables. Fonctionne juste, pas de problèmes. Je ne peux pas dire que cela devrait être la valeur par défaut (car elle n'est pas sûre), mais Dieu merci, elle existe.
trisweb
10

La différence est que simplepousse vers sa branche de suivi si elle a le même nom, tandis que currentpousse vers une branche du même nom quelle que soit la branche de suivi:

$ 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
la source