web-dev-qa-db-fra.com

Quelle est la différence entre git Push.default = current et Push.default = upstream?

La page de manuel de git-config répertorie les options suivantes pour Push.default:

nothing - do not Push anything.
matching - Push all matching branches. All branches having the same name in both ends are considered to be matching. This is the default.
upstream - Push the current branch to its upstream branch.
tracking - deprecated synonym for upstream.
current - Push the current branch to a branch of the same name.

Dans la plupart des cas, je supposerais que pousser sur une branche en amont d’une branche équivaudrait à une branche du même nom, puisque la branche en amont aurait normalement le même nom et que la branche du même nom ("current" ) serait normalement (ou toujours, par définition?) en amont. Alors quelle est la différence?

[~ # ~] met à jour [~ # ~] : La page de manuel de git-config a été mis à jour (comme on pourrait s’y attendre), donc les distinctions faites peuvent être beaucoup plus claires maintenant.

84
iconoclast

Vous avez résumé la différence dans votre question. upstream pousse sur la branche amont configurée, tandis que current suppose que la branche amont porte le même nom que la branche locale actuelle, et pousse à ce nom spécifique. En réalité, il n'y a aucune raison de supposer que la branche de suivi en amont d'une branche locale porte le même nom que la branche locale elle-même.

Par exemple, si vous travaillez dans plusieurs référentiels ou sur plusieurs télécommandes de développeurs partagées, vous finissez souvent par suivre différentes fourchettes de la même branche, telles que allen-master ou susan-master, qui suivent respectivement la branche master dans les dépôts d’Allen et Susan. Dans ce cas, current serait le paramètre incorrect, car ces noms de branche n'existent pas sur leurs télécommandes. upstream, cependant, fonctionnerait très bien.

Un exemple plus pratique pourrait consister à suivre à la fois un référentiel development et production. Votre flux de travail peut utiliser une branche principale différente pour chacun, mais cela peut prêter à confusion. Supposons que vous soyez un intégrateur de code et que vous souhaitiez suivre les branches master des deux référentiels séparément.

git checkout -b production --track production/master
git checkout -b development --track development/master

Vous avez maintenant deux branches qui suivent leurs dépôts respectifs, aucune d’elles n’utilisant la convention de nommage master. Il y a peu de confusion à propos des noms de branche: ils décrivent explicitement ce qu'ils suivent. Cependant, Push.default = current n'a aucun sens, car aucune des deux télécommandes ne contient une branche development ou production.

70
Christopher

current va pousser la branche actuelle vers une branche du même nom sur le référentiel distant.

upstream va pousser la branche actuelle vers la branche en amont.

La branche en amont est une branche qui a été explicitement ou implicitement définie comme étant en amont de votre branche actuelle. Cela signifie que Push et Pull par défaut seront synchronisés avec cette branche. La branche en amont peut se trouver dans le même dépôt que la branche en cours. Vous pouvez faire des choses intéressantes, comme configurer votre branche principale locale en amont de votre branche principale (sujet) locale, et transmettre et tirer entre eux.

La configuration implicite en amont se fait via le branch.autosetupmerge valeur de configuration. Vous pouvez trouver la documentation dans le git config page d'aide. La configuration en amont explicite se fait avec le -u option à la git branch commande. Voir la page d'aide pour plus de détails.

6
Yawar