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.

PlagueHammer
la source
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
UncleZeiv
la source
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.

Christoffer
la source
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

baudtack
la source
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
neoneye
la source
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.

Mukesh Chapagain
la source
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 à: [email protected]

VonC
la source
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.

Mat Schaffer
la source
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 )

Andriy F.
la source
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".

Cody Caughlan
la source
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
kenorb
la source
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

Mark Fisher
la source
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
}
MichaelMoser
la source