Comportement par défaut de «git push» sans branche spécifiée


1366

J'utilise la commande suivante pour pousser vers ma branche distante:

git push origin sandbox

Si je dis

git push origin

cela entraîne-t-il également des changements dans mes autres branches, ou cela ne fait-il que mettre à jour ma branche actuelle? J'ai trois branches: master, productionet sandbox.

La git pushdocumentation n'est pas très claire à ce sujet, je voudrais donc clarifier cela définitivement.

Quelles branches et télécommandes les git pushcommandes suivantes mettent-elles à jour exactement?

git push 
git push origin

origin ci-dessus est une télécommande.

Je comprends que cela git push [remote] [branch]ne poussera que cette branche vers la télécommande.


Concernant la configuration des outils diff en général, et le nouveau script git difftool, j'ai ajouté une nouvelle réponse dans cette autre question SO: stackoverflow.com/questions/255202/…
VonC

67
J'ai fait un article de blog sur le comportement surprenant de git push, ce qui pourrait être intéressant
Mark Longair

1
@Mark: dans d'autres travaux, en poussant uniquement la branche actuelle vers son suivi en amont. Agréable.
VonC


help.github.com/articles/pushing-to-a-remote mettant ce lien ici pour une aide immédiate aux novices comme moi
MycrofD

Réponses:


1591

Vous pouvez contrôler le comportement par défaut en définissant push.default dans votre configuration git. Depuis la documentation de git-config (1) :

push.default

Définit l'action que git push doit entreprendre si aucune spécification de référence n'est indiquée sur la ligne de commande, aucune spécification de référence n'est configurée dans la télécommande et aucune spécification de référence n'est impliquée par aucune des options fournies sur la ligne de commande. Les valeurs possibles sont:

  • nothing: ne poussez rien

  • matching: pousser toutes les branches correspondantes

    Toutes les branches ayant le même nom aux deux extrémités sont considérées comme étant identiques.

    C'était la valeur par défaut, mais pas depuis Git 2.0 ( simpleest la nouvelle valeur par défaut).

  • upstream: pousser la branche courante vers sa branche amont ( trackingest un synonyme obsolète pour amont)

  • current: pousser la branche courante vers une branche du même nom

  • simple: (nouveau dans Git 1.7.11) comme en amont, mais refuse de pousser si le nom de la branche en amont est différent du nom local

    C'est l'option la plus sûre et convient bien aux débutants.

    Ce mode est devenu le mode par défaut dans Git 2.0.

Les modes simples, actuels et en amont sont destinés à ceux qui veulent pousser une seule branche après avoir terminé le travail, même lorsque les autres branches ne sont pas encore prêtes à être poussées.

Exemples de ligne de commande:

Pour afficher la configuration actuelle:

git config --global push.default

Pour définir une nouvelle configuration:

git config --global push.default current

11
Il est probablement intéressant de noter que c'est nouveau dans la version 1.6.3: kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt
CB Bailey

8
Ce "push.default" est la meilleure chose qui soit pour travailler avec plusieurs dépôts. Réglez-le sur "suivi" et vous êtes tous bons. Combiné avec une branche - installée en amont, ce qui rend le push and pull plus pratique.
jpswain

13
"tracking" est le synonyme obsolète de "upstream": kernel.org/pub/software/scm/git/docs/git-config.html
LuckyMalaka

22
Il convient de noter qu'à partir de Git 1.7.11, il existe un nouveau simplemode. Ce mode est destiné à devenir la valeur par défaut à l'avenir. simplefonctionne comme upstream, mais comme currentnécessite que les noms des branches soient les mêmes aux deux extrémités.
Kai

9
Il convient de noter qu'à partir de Git 2.0, le simplecomportement est maintenant celui par défaut.
do0g

209

Vous pouvez configurer le comportement par défaut de votre git avec push.default

git config push.default current

ou si vous avez de nombreux référentiels et que vous voulez la même chose pour tous alors

git config --global push.default current

Le courant dans cette configuration signifie que par défaut, vous ne pousserez la branche actuelle que lorsque vous git push

Les autres options sont:

  • rien: ne poussez rien
  • matching: pousser toutes les branches correspondantes (par défaut)
  • suivi: Poussez la branche actuelle vers ce qu'elle suit
  • courant: pousser la branche courante

MISE À JOUR - NOUVELLE FAÇON DE LE FAIRE

Depuis Git 1.7.11, procédez comme suit:

git config --global push.default simple

Il s'agit d'un nouveau paramètre introduit qui fonctionne de la même manière que le courant, et sera défini par défaut sur git à partir de la version 2.0 selon les rumeurs.


29
Oui, j'ai lu la réponse à laquelle vous faites référence, mais cette réponse ne dit que quoi faire et non comment le faire. J'ai donc ajouté ma réponse pour que toutes les informations nécessaires à sa configuration se trouvent sur la même page.
Christoffer

3
D'ACCORD; il est préférable de suggérer une modification dudit message, car personne ne verra votre réponse, car il est peu probable qu'il obtienne autant de votes
CharlesB

comment procéder pour passer à la branche actuelle? git pull origine?
Francois

200

git push originpoussera tous les changements sur les branches locales qui ont des branches distantes correspondantes sur originAs forgit push

Fonctionne comme git push <remote>, où <remote>est la télécommande de la branche actuelle (ou l'origine, si aucune télécommande n'est configurée pour la branche actuelle).

Dans la section Exemples de la git-pushpage de manuel


2
Oui, cela rend clair. J'utilise probablement une ancienne version de git (1.6.1.1 Mac OS X) qui n'a pas ces exemples dans la page de manuel.
PlagueHammer

Je lance probablement 1.6.3.1. Je l'ai cependant trouvé sur le site que j'ai lié.
baudtack

2
Donc, dans mon cas, où toutes les branches locales ont la même "origine" distante, "git push" serait exactement la même chose que "git push origin" qui ne pousserait que les branches locales qui ont une branche correspondante dans la télécommande.
PlagueHammer

@Debajit Tout de suite! Grande question au fait. J'avais toujours supposé que git push ne ferait que pousser la branche actuelle. Apparemment non! Très bon à savoir.
baudtack

5
Cette question est ancienne mais pour tout nouveau, @docgnome a raison. Le simple fait d'exécuter 'git push origin' poussera toutes les branches au lieu de seulement la branche actuelle. Utilisez 'git push -f -v -n origin development' pour forcer le push d'une branche nommée development. Utilisez l'indicateur -n pour simuler le résultat du push git afin que vous puissiez voir à l'avance quelle (s) branche (s) seront affectées. Si cela semble bon, lancez 'git push -f -v origin development'. Cela pourrait être utile stackoverflow.com/questions/3741136/git-push-f-vs
Dylan Valade

54

Je viens de valider mon code dans une branche et de le pousser vers github, comme ceci:

git branch SimonLowMemoryExperiments
git checkout SimonLowMemoryExperiments
git add .
git commit -a -m "Lots of experimentation with identifying the memory problems"
git push origin SimonLowMemoryExperiments

3
Vous pouvez condenser le commit en `git commit -am" ... "`
James Harrington

17
Cette réponse a-t-elle quelque chose à voir avec la question ?? :?
Asim KT

26

Voici une information très pratique et utile sur Git Push : Git Push: Just the Tip

L'utilisation la plus courante de git push est de pousser vos modifications locales vers votre dépôt public en amont. En supposant que l'amont est un distant nommé "origin" (le nom distant par défaut si votre référentiel est un clone) et que la branche à mettre à jour vers / depuis est nommée "master" (le nom de la branche par défaut), cela se fait avec:git push origin master

git push origin poussera les modifications de toutes les branches locales vers les branches correspondantes de la télécommande d'origine.

git push origin master poussera les modifications de la branche principale locale vers la branche principale distante.

git push origin master:staging poussera les modifications de la branche maître locale vers la branche de transfert distante si elle existe.


git push origin branch_namepour une raison quelconque, pousser non seulement la branch_namebranche, mais aussi d'autres branches locales (git version 1.9.1).
mrgloom

git push origin master:stagingest un bijou caché génial!
Shakeel

19

(Mars 2012)
Attention: cette matchingpolitique " " par défaut pourrait changer bientôt
(parfois après git1.7.10 +)
:

Voir " Veuillez discuter: ce que" git push "devrait faire quand vous ne dites pas quoi pousser? "

Dans le paramètre actuel (ie push.default=matching), git pushsans argument poussera toutes les branches qui existent localement et à distance avec le même nom .
Cela est généralement approprié lorsqu'un développeur envoie à son propre référentiel public, mais peut être déroutant, voire dangereux, lors de l'utilisation d'un référentiel partagé.

La proposition est de changer la valeur par défaut en ' upstream' , c'est-à-dire de pousser uniquement la branche actuelle, et de la pousser vers la branche dont git pull tirerait.
Un autre candidat est ' current'; cela ne pousse que la branche actuelle vers la branche distante du même nom.

Ce qui a été discuté jusqu'à présent peut être vu dans ce fil:

http://thread.gmane.org/gmane.comp.version-control.git/192547/focus=192694

Les discussions pertinentes précédentes incluent:

Pour participer à la discussion, envoyez vos messages à: git@vger.kernel.org


18

Je viens de mettre cela dans ma section d'alias .gitconfig et j'adore comment cela fonctionne:

pub = "!f() { git push -u ${1:-origin} `git symbolic-ref HEAD`; }; f"

Poussera la branche courante vers l'origine avec git pubou un autre dépôt avec git pub repo-name. Délicieux.


4
C'est bien, mais cela suppose malheureusement que la branche porte le même nom sur l'autre référentiel. Essayez git push -u --repo="origin" $1;plutôt. Cela fonctionne assez bien, sauf si vous passez à un autre référentiel, le nom de la branche sera le nom utilisé par l'autre référentiel, pas celui à partir
duquel vous poussez

Hey, merci! Cela me donne envie de faire une version plus complète qui vérifie l'état du suivi avant de pousser. Mais je vais rester avec le mien pour l'instant car j'ai rarement des noms de branche différents entre les repos.
Mat Schaffer

10

Vous pouvez pousser la branche actuelle avec la commande

git push origin HEAD

(pris d' ici )


8

Un push git va essayer de pousser toutes les branches locales vers le serveur distant, c'est probablement ce que vous ne voulez pas. J'ai quelques configurations de commodités pour faire face à cela:

Alias ​​"gpull" et "gpush" de manière appropriée:

Dans mon ~ / .bash_profile

get_git_branch() {
  echo `git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'`
}
alias gpull='git pull origin `get_git_branch`'
alias gpush='git push origin `get_git_branch`'

Ainsi, exécuter "gpush" ou "gpull" ne poussera que ma branche "actuellement sur".


3
Si vous voulez toujours le comportement de gpush, vous pouvez également définir remote.origin.push = HEAD (par exemple "git config remote.origin.push HEAD"), comme mentionné dans la section des exemples de la page de manuel git-push.
Trevor Robinson

5
Ce n'est pas nécessaire si vous regardez le post ci-dessus par "Brian L".
jpswain

1
C'est, car il n'y a pas d'équv. pour pull pull.default
SamGoody

8

Vous pouvez modifier ce comportement par défaut dans votre .gitconfig, par exemple:

[push]
  default = current

Pour vérifier les paramètres actuels, exécutez:

git config --global --get push.default

3

Plutôt que d'utiliser des alias, je préfère créer des scripts git-XXX afin de pouvoir les contrôler plus facilement (nos développeurs ont tous un certain répertoire contrôlé par la source sur leur chemin pour ce type de chose).

Ce script (appelé git-setpush) définira la valeur de configuration pour remote.origin.pushvalue sur quelque chose qui ne fera que pousser la branche actuelle:

#!/bin/bash -eu

CURRENT_BRANCH=$(git branch | grep '^\*' | cut -d" " -f2)
NEW_PUSH_REF=HEAD:refs/for/$CURRENT_BRANCH

echo "setting remote.origin.push to $NEW_PUSH_REF"
git config remote.origin.push $NEW_PUSH_REF

notez que, comme nous utilisons Gerrit, il définit la cible refs/for/XXXà pousser dans une branche d'examen. Il suppose également que l'origine est votre nom distant.

Appelez-le après avoir vérifié une branche avec

git checkout your-branch
git setpush

Il pourrait évidemment être adapté pour faire également le paiement, mais j'aime que les scripts fassent une chose et le fassent bien


excellente idée de définir remote.origin.push pour une utilisation gerrit. Mes branches de fonctionnalités locales feature/fix_fubarsont toutes pointées vers des branches en amont plus génériques comme masterou develop, donc cela pointerait vers le mauvais en amont. À quoi ressemble votre flux local pour les référentiels contrôlés par gerrit?
spazm

Si vous n'avez qu'une seule branche "cible" sur gerrit, essayez simplement git config remote.origin.push HEAD:refs/for/master.
fracz

2

J'ai ajouté les fonctions suivantes dans mon fichier .bashrc pour automatiser ces tâches. Il fait git push / git pull + nom de la branche courante.

function gpush()
{
  if [[ "x$1" == "x-h" ]]; then
    cat <<EOF
Usage: gpush
git: for current branch: push changes to remote branch;
EOF
  else
    set -x
    local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`
    git push ${bname}
    set +x
  fi
}

function gpull()
{
  if [[ "x$1" == "x-h" ]]; then
    cat <<EOF
Usage: gpull
git: for current branch: pull changes from
EOF
  else
    set -x
    local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`
    git pull ${bname}
    set +x
  fi
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.