Comment pouvez-vous pousser une seule branche Git (et aucune autre branche)?

247

Je travaille sur un dépôt git local. Il y a deux branches, masteret feature_x.

Je veux pousser feature_xvers le référentiel distant, mais je ne veux pas pousser les modifications sur la masterbranche.

Est-ce qu'un git push origin feature_xde ma feature_xbranche (la feature_xbranche existe déjà à distance) fonctionnera?

Je ne veux pas tester cela sur ma box, car je ne peux pas pousser pour maîtriser en ce moment.

Rafael Mueller
la source
Jetez un œil ici: à distance et ici: poussez une branche vers github Sonne comme si cela fonctionnerait.
al.

Réponses:

376

oui, faites simplement ce qui suit

git checkout feature_x
git push origin feature_x
cpjolicoeur
la source
54
Avec git moderne, vous devriez pouvoir simplement "git push origin HEAD", ou même "git push HEAD" pour pousser uniquement la branche actuellement extraite.
Jakub Narębski
2
Est-il nécessaire de commander à feature_x?
hd.
5
oui, car si vous êtes sur master, il essaiera de pousser la branche master locale vers la branche feature_x distante. pour ne pas avoir à commander en premier, vous devez faire "git push origin feature_x: feature_x"
cpjolicoeur
1
@cpjolicoeur J'ai vu dans d'autres questions (par exemple: ici ) qu'ils font git push -u origin <branch-name>. Mais vous ne l'avez pas mentionné. Est-ce nécessaire ?
riroo
3
@miss_R l' -uoption sur une git-pushcommande définira la référence en amont pour suivre la branche qui vient d'être poussée. Cela fera que les choses comme git-pullsur cette branche à l'avenir savent déjà de quelle branche se tirer sans la spécifier. Il n'est pas nécessaire comme option pour pousser une seule branche, mais il est largement utilisé car beaucoup de gens veulent que la branche locale suive la branche distante qu'ils poussent.
cpjolicoeur
74

Par défaut, git pushmet à jour toutes les branches distantes. Mais vous pouvez configurer git pour mettre à jour uniquement la branche actuelle vers son amont.

git config push.default upstream

Cela signifie que git ne mettra à jour que la branche actuelle (extraite) lorsque vous git push.

Les autres options valides sont:

  • nothing: Ne pas pousser quoi que ce soit (erreur) sauf si une refspec est explicitement donnée . Ceci est principalement destiné aux personnes qui souhaitent éviter les erreurs en étant toujours explicites.
  • matching: Poussez toutes les branches portant le même nom aux deux extrémités. (option par défaut avant Ver 1.7.11)
  • upstream: Poussez la branche actuelle vers sa branche amont. 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 ). Pas besoin d'avoir le même nom pour la branche locale et distante.
  • tracking: Obsolète, utilisez upstreamplutôt.
  • current: Poussez la branche actuelle vers la branche distante du même nom à l'extrémité de réception. Fonctionne dans les workflows centraux et non centraux.
  • simple: [disponible depuis la version 1.7.11] dans un workflow centralisé, fonctionne comme upstreamavec une sécurité supplémentaire pour refuser de pousser si le nom de la branche 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 current. C'est l'option la plus sûre et convient aux débutants. Ce mode est devenu le mode par défaut dans Git 2.0.
Karthik Bose
la source
2
Merci, currentc'est ce que je cherchais, par défaut git pushdans la foobranche le poussera vers la origin/foobranche.
Dorian
@ Dorian merci, je suis d'accord que currentcela a plus de sens par défaut.
Zoltán
@ Dorian, @ Zoltán - Je pense que simplecela a plus de sens par défaut. J'ai mis à jour la réponse avec «quand utiliser quoi». Pls jeter un oeil.
Karthik Bose,
1
Remarque: depuis git version 2, la valeur par défaut est devenue simple.
Danijel
8

Mise à jour mineure en plus de la réponse de Karthik Bose - vous pouvez configurer git globalement, pour que tous vos espaces de travail se comportent de cette façon:

git config --global push.default upstream
Bhaskar
la source
en amont n'a pas été reconnu comme un paramètre valide pour moi, a dû mettre «actuel» à la place
sauterelle
-2

Supposons donc que vous ayez une branche locale foo, une télécommande appelée origine et une branche distante origine / maître.

Pour pousser le contenu de foo vers origin / master, vous devez d'abord définir son amont:

git checkout foo
git branch -u origin/master

Ensuite, vous pouvez pousser vers cette branche en utilisant:

git push origin HEAD:master

Dans la dernière commande, vous pouvez ajouter --force pour remplacer tout l'historique d'origine / maître par celui de foo.

CodeKid
la source