Je crée une nouvelle branche dans Git:
git branch my_branch
Poussez-le:
git Push Origin my_branch
Maintenant, disons que quelqu'un a fait des changements sur le serveur et que je veux extraire de Origin/my_branch
. Je fais:
git pull
Mais je reçois:
You asked me to pull without telling me which branch you
want to merge with, and 'branch.my_branch.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.
If you often merge with the same branch, you may want to
use something like the following in your configuration file:
[branch "my_branch"]
remote = <nickname>
merge = <remote-ref>
[remote "<nickname>"]
url = <url>
fetch = <refspec>
See git-config(1) for details.
J'ai appris que je peux le faire fonctionner avec:
git branch --set-upstream my_branch Origin/my_branch
Mais pourquoi dois-je le faire pour chaque branche que je crée? N'est-il pas évident que si je pousse my_branch
dans Origin/my_branch
, je voudrais alors extraire Origin/my_branch
dans my_branch
? Comment puis-je en faire le comportement par défaut?
Un raccourci, qui ne dépend pas de la mémorisation de la syntaxe pour git branch --set-upstream
1 est de faire:
git Push -u Origin my_branch
... la première fois que vous poussez cette branche. Ou bien, appuyez sur la branche actuelle vers une branche du même nom (pratique pour un alias):
git Push -u Origin HEAD
Il vous suffit d'utiliser -u
une seule fois, ce qui configure l'association entre votre branche et celle de Origin
de la même manière que git branch --set-upstream
.
Personnellement, je pense que c’est une bonne chose de devoir établir explicitement cette association entre votre branche et celle de la télécommande. Dommage que les règles soient différentes pour git Push
et git pull
.
1 Cela peut paraître idiot, mais j'oublie très souvent de spécifier la branche actuelle, en supposant que ce soit la valeur par défaut - ce n'est pas le cas, et les résultats sont très déroutants :)
Mise à jour 2012-10-11 : Apparemment, je ne suis pas la seule personne à avoir trouvé ça facile de se tromper! Merci à VonC pour avoir signalé que git 1.8.0 introduit le plus évident git branch --set-upstream-to
, qui peut être utilisé comme suit si vous êtes sur la branche my_branch
:
git branch --set-upstream-to Origin/my_branch
... ou avec l'option courte:
git branch -u Origin/my_branch
Cette modification et son raisonnement sont décrits dans la section notes de version de git 1.8.0, version candidate 1 :
Il était tentant de dire
git branch --set-upstream Origin/master
, mais cela dit à Git d'arranger la branche localeOrigin/master
pour qu'elle s'intègre à la branche actuellement extraite, ce qui est très peu probable de ce que l'utilisateur voulait dire. L'option est obsolète. utilisez plutôt la nouvelle option--set-upstream-to
(avec un raccourci-doux-u
).
Vous pouvez y arriver avec moins de frappe. Tout d’abord, changez le fonctionnement de votre Push:
git config --global Push.default current
Ceci déduira la partie Origin my_branch
, ainsi vous pourrez faire:
git Push -u
Ce qui créera à la fois la branche distante du même nom et le suivra.
Vous pouvez simplement
git checkout -b my-branch Origin/whatever
en premier lieu. Si vous définissez branch.autosetupmerge
ou branch.autosetuprebase
(mon favori) sur always
(la valeur par défaut est true
), my-branch
suivra automatiquement Origin/whatever
.
Voir git help config
.
Vous pouvez configurer en amont plus simple de deux manières. D'abord lorsque vous créez la branche:
git branch -u Origin/my-branch
ou après avoir créé une branche, vous pouvez utiliser cette commande.
git Push -u Origin my-branch
Vous pouvez également créer des branches, extraire et configurer en amont en une seule commande:
git checkout -b my-branch -t Origin/my-branch
Personnellement, je préfère faire ceci en une commande en deux étapes:
git checkout -b my-branch
git Push -u Origin my-branch
Ceci est mon utilisation la plus courante pour The Fuck .
$ git Push
fatal: The current branch master has no upstream branch.
To Push the current branch and set the remote as upstream, use
git Push --set-upstream Origin master
$ fuck
git Push --set-upstream Origin master [enter/↑/↓/ctrl+c]
Counting objects: 9, done.
...
En outre, il est amusant de taper des gros mots sur votre terminal.
Vous pouvez utiliser:
git config --global branch.autosetupmerge toujours
qui reliera la branche en amont chaque fois que vous créez ou extrayez une nouvelle branche.
Voir https://felipec.wordpress.com/2013/09/01/advanced-git-concepts-the-upstream-tracking-branch/
Cela fonctionne également avec autosetuprebase, si vous suivez un flux de travail plus axé sur la rebase, mais ne l'utilisez pas à moins que vous ne sachiez ce que vous faites, car votre comportement d'extraction par défaut sera rebase, ce qui peut entraîner des résultats étranges.
A propos, le raccourci pour pousser la branche actuelle vers une télécommande du même nom:
$ git Push -u Origin HEAD
Personnellement, j'utilise ces alias suivants dans Bash
dans le fichier ~/.gitconfig
[alias]
pushup = "!git Push --set-upstream Origin $(git symbolic-ref --short HEAD)"
et dans le fichier ~/.basehrc ou ~/.zshrc
alias gpo="git pushup"
alias gpof="gpo -f"
alias gf="git fetch"
alias gp="git pull"
git branch --set-upstream-to=Origin/master<branch_name>
Pour ce que cela vaut, si vous essayez de suivre une branche qui existe déjà sur la télécommande (par exemple, Origin/une branche) mais que vous n'avez pas encore extrait localement, vous pouvez le faire:
$ git checkout --track Origin/somebranch
Remarque: '-t' est la version abrégée de l'option '--track'.
Cela met en place la même association dès le départ.
J'utilise cet alias Git au lieu de copier/coller la suggestion de Git à chaque fois: https://Gist.github.com/ekilah/88a880c84a50b73bd306
Source copiée ci-dessous (ajoutez ceci à votre fichier ~/.gitconfig
]):
[alias]
pushup = "!gitbranchname() { git symbolic-ref --short HEAD; }; gitpushupstream() { git Push --set-upstream Origin `gitbranchname`; }; gitpushupstream"
Vous pouvez aussi explicitement indiquer à git pull quelle branche distante extraire (comme il est mentionné dans le message d'erreur):
git pull <remote-name> <remote-branch>
Soyez prudent avec ceci, cependant: si vous êtes sur une autre branche et effectuez un tirage explicite, le refspec que vous tirez sera fusionné dans la branche sur laquelle vous vous trouvez!
Vous pouvez créer un très bon alias capable de gérer cela sans la syntaxe trop détaillée.
J'ai l'alias suivant dans ~/.gitconfig
:
po = "!git Push -u Origin \"$(git rev-parse --abbrev-ref HEAD)\""
Après avoir validé une nouvelle branche, vous pouvez envoyer votre nouvelle branche en tapant simplement la commande suivante:
git po
Si le ci-dessous ne fonctionne pas:
git config --global Push.default current
Vous devez également mettre à jour la configuration locale de votre projet, car il est possible que votre projet dispose de configurations git locales:
git config --local Push.default current
Pour ceux qui recherchent un alias qui fonctionne avec git pull
, voici ce que j'utilise:
alias up="git branch | awk '/^\\* / { print \$2 }' | xargs -I {} git branch --set-upstream-to=Origin/{} {}"
Maintenant, chaque fois que vous obtenez:
$ git pull
There is no tracking information for the current branch.
...
Il suffit de courir:
$ up
Branch my_branch set up to track remote branch my_branch from Origin.
$ git pull
Et vous êtes prêt à partir
Parce que git a la capacité de pousser/tirer différentes branches vers différents référentiels "en amont". Vous pouvez même utiliser des référentiels distincts pour pousser et tirer - sur la même branche. Cela peut créer un flux distribué à plusieurs niveaux, ce qui peut être utile pour des projets tels que le noyau Linux. Git a été à l'origine construit pour être utilisé sur ce projet.
Par conséquent, il n’est pas possible de savoir quelle pension votre succursale devrait suivre.
D'un autre côté, la plupart des gens n'utilisent pas git de cette façon, ce qui pourrait bien justifier une option par défaut.
Git est généralement assez bas et cela peut être frustrant. Pourtant, il existe des interfaces graphiques et il devrait être facile d'écrire des scripts d'assistance si vous souhaitez toujours l'utiliser à partir du shell.
Vous pouvez aussi faire git Push -u Origin $(current_branch)
Nous utilisons un phabricateur et n’appuyons pas sur git. Je devais créer bash alias qui fonctionne sous Linux/mac
vim ~/.bash_aliases
new_branch() {
git checkout -b "$1"
git branch --set-upstream-to=Origin/master "$1"
}
enregistrer
source ~/.bash_aliases
new_branch test #instead of git checkout -b test
git pull
J'ai en quelque sorte redécouvert legit
à cause de ce problème (OS X uniquement). Maintenant, tout ce que j'utilise lors de la création de branches sont ces deux commandes:
legit publish [<branch>]
Publie la branche spécifiée sur la télécommande. (alias: pub
)
legit unpublish <branch>
Supprime la branche spécifiée de la télécommande. (alias: unp
)
SublimeGit est livré avec le support legit
par défaut, ce qui rend la routine de branchement aussi simple que d'appuyer sur Ctrl-b.
Voici un alias bash pour git Push qui peut être exécuté en toute sécurité et qui bascule automatiquement entre les réglages en amont de la première poussée et les poussées normales par la suite.
alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git Push -u Origin $(git symbolic-ref --short HEAD) || git Push'