Comportement par défaut de "git push" sans branche spécifiée
j'utilise la commande suivante pour pousser vers ma branche distante:
git push origin sandbox
si je dis
git push origin
est-ce que cela pousse les changements dans mes autres branches aussi, ou est-ce que cela ne fait que mettre à jour ma branche actuelle? J'ai trois branches: master
, production
et sandbox
.
la documentation git push
n'est pas très claire à ce sujet, donc j'aimerais clarifier ceci pour de bon.
qui les branches et les télécommandes font-elles exactement la mise à jour des commandes git push
suivantes?
git push
git push origin
origin
ci-dessus est une télécommande.
je comprends que git push [remote] [branch]
poussera seulement cette branche vers la télécommande.
12 réponses
vous pouvez contrôler le comportement par défaut en paramétrant push.par défaut dans votre git config. De git-config(1) de la documentation :
push.default
définit l'action que doit prendre git push si aucun refspec n'est donné sur la ligne de commande, aucun refspec n'est configuré dans la télécommande, et aucun refspec n'est impliqué par aucune des options données sur la ligne de commande. Les valeurs possibles sont:
-
nothing
: do pas pousser quoi que ce soit -
matching
: poussez tous les branchestoutes les succursales portant le même nom aux deux extrémités sont considérées comme correspondant.
C'est la valeur par défaut de Git 1.x.
-
upstream
: pousser la branche courante vers sa branche amont (tracking
est un synonyme déprécié pour amont) -
current
: pousser la branche courante à une branche du même nom -
simple
: (nouveau en Git 1.7.11) comme en amont, mais refuse de pousser si le nom de la branche en amont est différent de celui de la branche localec'est l'option la plus sûre et convient bien aux débutants.
cela deviendra la valeur par défaut dans Git 2.0.
Les modes simple, courant et amont sont pour ceux qui veulent pousser une seule branche après avoir terminé le travail, même si les autres branches ne sont pas encore prêtes à être repoussées
exemples en ligne de commande:
pour voir la configuration actuelle:
git config --global push.default
pour définir une nouvelle configuration:
git config --global push.default current
git push origin
va pousser tous les changements sur les branches locales qui ont des branches distantes correspondantes à origin
comme pour git push
fonctionne comme
git push <remote>
, où<remote>
est la télécommande de la branche courante (ou l'origine, si aucune télécommande n'est configurée pour la branche courante).
à Partir des Exemples de la section git-push
l'homme page
Vous pouvez configurer le comportement par défaut pour votre git push.par défaut
git config push.default current
ou si vous avez beaucoup de dépôts et veux le même pour tous, alors
git config --global push.default current
le courant dans cette configuration signifie que par défaut vous allez seulement pousser la branche courante quand vous faites git push
les autres options sont:
- rien: ne poussez rien
- matching : Pousser tous les branches (par défaut)
- suivi de : Pousser la branche courante pour ce qu'il est suivi de
- courant: pousser la branche courante
MISE À JOUR - NOUVELLE FAÇON DE FAIRE DE CETTE
en date du 1.7.11 git faire ce qui suit:
git config --global push.default simple
c'est un nouveau réglage introduit qui fonctionne de la même manière que current, et sera rendu par défaut à git à partir de v 2.0 selon les rumeurs
j'ai juste donné mon code à une branche et je l'ai poussé à 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
Voici une information très pratique et utile sur git Push : Git Push: Juste la Pointe
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 par défaut si votre dépôt est un clone) et que la branche à mettre à jour est nommée" master " (le nom par défaut de la branche), cela se fait avec: git push origin master
git push origin
va pousser les changements de toutes les branches locales vers les branches correspondantes à distance d'origine.
git push origin master
va pousser les changements de la branche principale locale à la branche principale distante.
git push origin master:staging
va pousser les changements de la branche principale locale à la branche de staging distante si elle existe.
(mars 2012)
attention: que la valeur par défaut " matching
"politique pourrait changer bientôt
(parfois après git1.7.10+) :
Voir " s'il vous Plaît discuter: ce "git push" à faire quand vous ne dites pas ce que pour pousser? "
Dans le contexte actuel (c'est à dire
push.default=matching
),git push
sans 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 pousse vers son propre dépôt public, mais peut être déroutant, voire dangereux, lorsqu'il utilise un dépôt partagé.la proposition est de changer la valeur par défaut à
upstream
, c'est-à-dire pousser seulement la branche courante, et la pousser à la branche git tirer serait tirer de.
Un autre candidat est 'current
"; cela pousse seulement la branche courante à 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 antérieures pertinentes comprennent:
- http://thread.gmane.org/gmane.comp.version-control.git/123350/focus=123541
- http://thread.gmane.org/gmane.comp.version-control.git/166743
pour participer à la discussion, envoyez vos messages à: git@vger.kernel.org
je viens de mettre ça dans le mien .gitconfig section alias et de l'amour comment cela fonctionne:
pub = "!f() { git push -u ${1:-origin} `git symbolic-ref HEAD`; }; f"
poussera la branche courante à l'origine avec git pub
ou une autre pension avec git pub repo-name
. Savoureux.
un git push va essayer de pousser toutes les branches locales vers le serveur distant, c'est probablement ce que vous ne voulez pas. J'ai un couple de commodités setup pour faire face à cela:
Alias "gpull" et "gpush de façon appropriée":
Dans mon ~/.bash_profile
get_git_branch() {
echo `git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)//'`
}
alias gpull='git pull origin `get_git_branch`'
alias gpush='git push origin `get_git_branch`'
ainsi, l'exécution de" gpush "ou" gpull "poussera juste ma branche" actuellement en service".
vous pouvez changer ce comportement par défaut dans votre .gitconfig
, par exemple:
[push]
default = current
pour vérifier les paramètres actuels, Lancez:
git config --global --get push.default
plutôt que d'utiliser des alias, je préfère créer des scripts git-XXX pour pouvoir les contrôler plus facilement (nos développeurs ont tous un dir contrôlé par source sur leur chemin pour ce type de chose).
ce script (appelé git-setpush
) définira la valeur de configuration pour remote.origin.push
à quelque chose qui poussera seulement la branche courante:
#!/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
note, Comme nous utilisons Gerrit
, il fixe l'objectif à refs/for/XXX
de pousser dans une direction générale de l'examen. Il suppose également l'origine est votre nom distant.
L'invoquer après avoir vérifié une succursale avec
git checkout your-branch
git setpush
il pourrait évidemment être adapté pour faire aussi la caisse, mais j'aime les scripts à faire une chose et le faire bien
j'ai ajouté les fonctions suivantes dans mon .bashrc fichier pour automatiser ces tâches. Il fait git push / git pull + nom de la branche courante.
function gpush()
{
if [[ "x" == "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" == "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
}