Git - Quelle est la différence entre push.default "matching" et "simple"

285

J'utilise git depuis un certain temps maintenant, mais je n'ai jamais eu à créer moi-même un nouveau dépôt à distance et j'ai été curieux de le faire. J'ai lu des tutoriels et je ne sais pas comment faire fonctionner "git push".

Si je l'utilise simplement, git pushil me demande de voir une branche par défaut (?) Vers laquelle pointer? Quelle est la différence entre ces deux options qu'il me propose?

git config --global push.default matching
git config --global push.default simple

La correspondance pousse simplement toutes les branches que j'ai sur mon référentiel local, et si elles ne correspondent pas, je dois ensuite lui dire manuellement de pousser toutes les nouvelles branches locales que j'ai, n'est-ce pas? Est-ce la meilleure pratique à utiliser ou la meilleure solution simple?

Josh
la source
1
Maintenant, si seulement pull.defaultest disponible pour mettre à jour toutes ces branches localement
Nogurenn

Réponses:

367

git push peut pousser toutes les branches ou une seule en fonction de cette configuration:

Poussez toutes les branches

git config --global push.default matching

Il poussera toutes les branches vers la branche distante et les fusionnerait. Si vous ne voulez pas pousser toutes les branches, vous ne pouvez pousser que la branche actuelle.

Poussez uniquement la branche actuelle

git config --global push.default simple

Il est donc préférable, à mon avis, d'utiliser cette option et de pousser votre code branche par branche. Il est préférable de pousser les branches manuellement et individuellement.

Lalit Sachdeva
la source
16
J'ai aimé la push.default currentréponse de @UpAndAdam. Ne le savait pas.
alanjds
4
Notez que ce simplen'est plus une option. Dans 1.7.8.4(et plus tôt?), Il en résulte une erreur lorsque vous essayez de pousser. mais currentest toujours disponible
sixty4bit
@ sixty4bit: j'utilise la version 1.7.1 de git. J'utilise tracking-> pousser la branche actuelle vers sa branche amont.
kevinarpe
@ sixty4bit Non, il a été inclus dans une version ultérieure de Git, je ne sais pas dans laquelle, mais (1.7) est vieux comme l'enfer, même pour 2016. Je ne recommanderais pas du tout d'utiliser de telles anciennes versions.
Schmoudi
Voté. Désolé, mais la description de la page liée simplen'a pas de sens, contredit cette réponse et est incorrecte - ce qui rend cette réponse confuse. La page liée indique simple"poussera les branches une par une. Généralement connecté à la branche actuelle." Est-ce à dire que cela va pousser les branches séquentiellement plutôt qu'en parallèle? Que signifie «principalement connecté»? Ensuite, la description de simplecontinue pour citer la description de matching, pour laquelle on pourrait penser que la description de matchings'applique également simple. Mais évidemment ce n'est pas vrai.
tvanc
91

De la documentation GIT: Git Docs

Ci-dessous donne les informations complètes. En bref, simplene poussera le current working branchet même alors que s'il a également le même nom sur la télécommande. Ceci est un très bon réglage pour les débutants et deviendra la valeur par défautGIT 2.0

Alors que matchingva pousser toutes les branches localement qui ont le même nom sur la télécommande. (Sans égard à votre branche de travail actuelle). Cela signifie que de nombreuses branches différentes seront potentiellement poussées, y compris celles que vous ne voudrez peut-être même pas partager.

Dans mon utilisation personnelle, j'utilise généralement une option différente: currentqui pousse la branche de travail actuelle (car je branche toujours pour tout changement). Mais pour un débutant, je suggèresimple

push.default
Définit l'action que git push doit entreprendre si aucune refspec n'est explicitement indiquée. Différentes valeurs sont bien adaptées à des workflows spécifiques; par exemple, dans un flux de travail purement central (c'est-à-dire que la source d'extraction est égale à la destination du push), l'amont est probablement ce que vous voulez. Les valeurs possibles sont:

rien - ne pas pousser quoi que ce soit (erreur) sauf si une spécification de référence est explicitement donnée. Ceci est principalement destiné aux personnes qui souhaitent éviter les erreurs en étant toujours explicites.

current - appuyez sur la branche actuelle pour mettre à jour une branche avec le même nom du côté réception. Fonctionne dans les workflows centraux et non centraux.

upstream - repousse la branche courante vers la branche dont les changements sont généralement intégrés dans la branche courante (qui s'appelle @ {upstream}). Ce mode n'a de sens que si vous passez au même référentiel à partir duquel vous tirez normalement (c'est-à-dire le flux de travail central).

simple - dans un flux de travail centralisé, travaillez comme en amont avec une sécurité supplémentaire pour refuser de pousser si le nom de la branche en amont est différent du nom local.

Lorsque vous poussez vers une télécommande différente de la télécommande à partir de laquelle vous tirez normalement, travaillez comme courant. C'est l'option la plus sûre et convient aux débutants.

Ce mode deviendra la valeur par défaut dans Git 2.0.

correspondant - pousser toutes les branches ayant le même nom aux deux extrémités. Cela rend le référentiel que vous appuyez pour se souvenir de l'ensemble des branches qui seront expulsées (par exemple, si vous y poussez toujours maint et master et aucune autre branche, le référentiel vers lequel vous poussez aura ces deux branches, et votre maint et master local sera poussé là-bas).

Pour utiliser ce mode efficacement, vous devez vous assurer que toutes les branches que vous souhaitez sortir sont prêtes à être sorties avant d'exécuter git push, car le but de ce mode est de vous permettre de pousser toutes les branches en une seule fois. Si vous finissez généralement de travailler sur une seule branche et que vous extrayez le résultat, alors que les autres branches ne sont pas terminées, ce mode n'est pas pour vous. De plus, ce mode ne convient pas pour pousser dans un référentiel central partagé, car d'autres personnes peuvent y ajouter de nouvelles branches ou mettre à jour la pointe des branches existantes hors de votre contrôle.

C'est actuellement la valeur par défaut, mais Git 2.0 changera la valeur par défaut en simple.

UpAndAdam
la source
oui, mais je suppose même avec le paramètre push.default que si vous faites "$ git push origin master ", il ne fera que pousser la branche actuelle à l'origine vers la branche d'origine avec le même nom ... non? vous devez mentionner qu'il existe également une télécommande par défaut
Alexander Mills
1
Je ne suis pas sûr de comprendre à quoi vous voulez en venir. Dans N'IMPORTE QUEL MODE si vous dites que git push origin mastercela fera la même chose. Le point des modes et des valeurs par défaut est généralement ce qui se passe lorsque vous dites simplement git pushet que vous ne lui dites pas une télécommande ou une branche. Quel paramètre par défaut? vous voulez dire le paramètre par défaut de push.default? le paramètre par défaut dans quelle version de git ... si vous ne l'obtenez pas, votre commentaire est extrêmement vague.
UpAndAdam
'push.default Définit l'action que git push doit entreprendre si aucune refspec n'est explicitement indiquée' si vous dites git push origin master, vous lui donnez plus d'informations et il se peut qu'il ne fasse toujours pas ce que vous décrivez; selon la refspec que vous avez configurée. git-scm.com/book/en/v2/Git-Internals-The-Refspec
UpAndAdam
2

Notes de publication de Git v2.0

Remarques sur la compatibilité descendante

Quand git push [$there]ne dit pas quoi pousser, nous avons utilisé la sémantique traditionnelle de "correspondance" jusqu'à présent (toutes vos branches ont été envoyées à la télécommande tant qu'il y a déjà des branches du même nom là-bas). Dans Git 2.0, la valeur par défaut est maintenant la sémantique "simple", qui pousse:

  • uniquement la branche en cours vers la branche avec le même nom, et uniquement lorsque la branche en cours est configurée pour s'intégrer à cette branche distante, si vous passez à la même télécommande que vous récupérez; ou

  • uniquement la branche actuelle vers la branche du même nom, si vous poussez vers une télécommande qui n'est pas celle d'où vous allez habituellement chercher.

Vous pouvez utiliser la variable de configuration "push.default" pour changer cela. Si vous êtes un ancien qui veut continuer à utiliser la sémantique "correspondante", vous pouvez définir la variable sur "correspondant", par exemple. Lisez la documentation pour d'autres possibilités.

Quand git add -uet git add -Asont exécutés à l'intérieur d'un sous-répertoire sans spécifier les chemins à ajouter sur la ligne de commande, ils opèrent sur toute l'arborescence pour la cohérence avec git commit -aet d'autres commandes (ces commandes ne fonctionnaient que sur le sous-répertoire en cours). Dites git add -u .ou git add -A .si vous souhaitez limiter l'opération au répertoire actuel.

git add <path>est le même que git add -A <path>maintenant, donc cela git add dir/remarquera les chemins que vous avez supprimés du répertoire et enregistrera la suppression. Dans les anciennes versions de Git, git add <path>utilisé pour ignorer les suppressions. Vous pouvez dire git add --ignore-removal <path>d'ajouter uniquement des chemins ajoutés ou modifiés <path>, si vous le souhaitez vraiment.

CodeWizard
la source