web-dev-qa-db-fra.com

Pourquoi dois-je explicitement pousser une nouvelle branche?

Je suis nouveau dans git et je pratique. J'ai créé une branche locale mais j'ai constaté que lorsque j'ai fait git Push ma branche n'a pas été téléchargée dans le référentiel. Je devais réellement faire: git Push -u Origin --all.
Pourquoi est-ce? Une branche n'est-elle pas un nouveau changement à pousser par défaut? Pourquoi ai-je besoin d'exécuter la deuxième commande?

160
Cratylus

La raison réelle est que, dans un nouveau référentiel (git init), il n'y a pas de branche (no master, pas de branche du tout, zéro branche)

Ainsi, lorsque vous appuyez pour la première fois sur un vide rapport amont (généralement un n ), ce rapport amont n'a pas de branche du même nom.

Et:

Dans les deux cas, le référentiel vide en amont n'a pas de branche:

  • il n'y a pas encore de branche nommée correspondante
  • il n'y a pas de branche en amont du tout (avec ou sans le même nom! Suivi ou non)

Cela signifie que votre locale est la première Push n'a aucune idée:

  • où pousser
  • que pousser (puisqu'il ne trouve aucune branche en amont enregistrée ni en tant que branche de suivi distante et/ou portant le même nom)

Donc, vous devez au moins faire un:

git Push Origin master

Mais si vous ne faites que cela, vous:

  • créera une branche master en amont sur le flux amont (maintenant référentiel non vide): bon.
  • not enregistrer que la branche locale 'master' doit être poussée en amont (Origin) 'master' (branche amont) ): mauvais.

C'est pourquoi il est recommandé, pour le premier Push, de faire un:

git Push -u Origin master

Cela enregistrera Origin/master en tant que branche de suivi à distance , et permettra à la prochaine Push de pousser automatiquement master vers Origin/master.

git checkout master
git Push

Et cela fonctionnera aussi avec les stratégies Push 'current' ou 'upstream'.
Dans chaque cas, après le git Push -u Origin master initial, il suffira d’un simple git Push pour continuer à pousser le maître dans la branche en amont droite.

202
VonC

vous ne voyez pas ci-dessous

Je trouve cette "fonctionnalité" plutôt gênante puisque je n'essaie pas de lancer des roquettes sur la lune, mais de pousser ma fichue branche. Vous le faites probablement aussi, sinon vous ne seriez pas là!

Voici le correctif: si vous voulez implicitement pousser pour la branche en cours indépendamment de si cette branche existe sur l'origine, émettez cette commande une fois et vous aurez jamais à nouveau n'importe où:

git config --global Push.default current

Donc, si vous faites des branches comme ceci:

git checkout -b my-new-branch

puis faire des commits et ensuite faire un

git Push -u

pour les amener à Origin (étant sur cette branche) et cela créera ladite branche pour vous si elle n'existe pas.

Notez que le bit -u s'assure qu'ils sont liés si vous retirez plus tard de ladite branche. Si vous n'envisagez pas de tirer la branche plus tard (ou si vous le souhaitez, vous êtes d'accord avec une autre doublure) -u n'est pas nécessaire.

101
John Culviner

Sortie de git Push lors de l'insertion d'une nouvelle branche

> git checkout -b new_branch
Switched to a new branch 'new_branch'
> git Push
fatal: The current branch new_branch has no upstream branch.
To Push the current branch and set the remote as upstream, use

    git Push --set-upstream Origin new_branch

Un simple git Push suppose qu'il existe déjà une branche distante suivie par la branche locale actuelle. S'il n'existe pas de branche distante de ce type et que vous souhaitez la créer, vous devez spécifier cela à l'aide de l'indicateur -u (forme abrégée de --set-upstream).

Pourquoi c'est comme ça? Je suppose que les responsables de la mise en œuvre ont estimé que la création d'une branche sur la télécommande est une action tellement importante qu'il devrait être difficile de le faire par erreur. git Push est quelque chose que vous faites tout le temps.

"Une branche ne constitue-t-elle pas un nouveau changement à appliquer par défaut?" Je dirais que "un changement" dans Git est un commit. Une branche est un pointeur sur un commit. Pour moi, il est plus logique de penser à une Push comme quelque chose qui pousse vers les autres référentiels. Les commits qui sont envoyés sont déterminés par la branche sur laquelle vous vous trouvez et la relation de suivi de cette branche avec les branches de la télécommande.

Vous pouvez en savoir plus sur le suivi des branches dans le chapitre chapitre Branches distantes du livre Pro Git .

37
Klas Mellbourn

Je ne pouvais pas trouver une justification aussi rapidement par les développeurs d'origine, mais je peux vous donner une supposition éclairée basée sur quelques années d'expérience de Git.

Non, toutes les branches ne sont pas quelque chose que vous voulez pousser au monde extérieur. Cela pourrait représenter une expérience privée.

De plus, où git Push devrait-il envoyer toutes les branches? Git peut fonctionner avec plusieurs télécommandes et vous voudrez peut-être avoir différents ensembles de branches sur chacun. Par exemple. un projet central GitHub repo peut avoir des branches de publication; un fork de GitHub peut avoir des branches de sujet à examiner; et un serveur Git local peut avoir des branches contenant une configuration locale. Si git Push poussait toutes les branches sur la télécommande suivie par la branche actuelle, ce type de schéma serait facile à bousiller.

4
Fred Foo

HEAD est l'abréviation de branch branch, donc git Push -u Origin HEAD fonctionne. Maintenant, pour éviter cette saisie à chaque fois que j'utilise un alias:

git config --global alias.pp 'Push -u Origin HEAD'

Après cela, chaque fois que je veux pousser une branche créée via git -b, je peux la pousser en utilisant:

git pp

J'espère que cela fait gagner du temps à quelqu'un!

3
Aurimas Rekštys

Au premier contrôle

Étape 1: git remote -v
// si trouvé git initialise puis supprime ou saute l'étape 2

Étape 2: git remote rm Origin
// Configurez ensuite votre adresse email globalement git

Étape 3: git config --global user.email "[email protected]"

Étape 4: git initial

Étape 5: git commit -m "Initial Project"
// Si vous avez déjà ajouté un dépôt de projet, passez à l'étape 6.

Étape 6: git remote add Origin %repo link from bitbucket.org%

Étape 7: git Push -u Origin master

2
Md.Milton