web-dev-qa-db-fra.com

Comment obtenez-vous git de toujours tirer d'une branche spécifique?

Je ne suis pas un maître git, mais je travaille dessus depuis un certain temps, avec plusieurs projets différents. Dans chaque projet, j'ai toujours git clone [repository] et à partir de là, je peux toujours git pull, tant que je n'ai pas de modifications en attente, bien sûr.

Récemment, j'ai dû revenir à une branche précédente, avec git checkout 4f82a29. Lorsque j'étais à nouveau prêt à tirer, j'ai découvert que je devais régler ma branche sur maître. Maintenant, je ne peux pas tirer avec un git pull droit, mais plutôt spécifier git pull Origin master, ce qui est gênant et m'indique que je ne comprends pas tout à fait ce qui se passe.

Qu'est-ce qui a changé et qui ne me permet pas de faire une suite git pull sans spécifier Origin Master, et comment puis-je le modifier?

MISE À JOUR:

-bash-3.1$ cat config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[branch "master"]
[remote "Origin"]
    url = [email protected]:user/project.git
    fetch = refs/heads/*:refs/remotes/Origin/*

UPDATE 2: Pour être clair, je comprends que ma méthode d'origine était peut-être incorrecte, mais je dois corriger ce dépôt pour pouvoir simplement utiliser à nouveau git pull. Actuellement, git pull résulte en:

-bash-3.1$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.master.merge' in
your configuration file does not tell me either.  Please
name which branch you want to merge on the command line and
try again (e.g. 'git pull  ').
See git-pull(1) for details on the refspec.

If you often merge with the same branch, you may want to
configure the following variables in your configuration
file:

    branch.master.remote = 
    branch.master.merge = 
    remote..url = 
    remote..fetch = 

See git-config(1) for details.

Je peux dire à git pull quelle branche fusionner, et cela fonctionne correctement, mais git pull ne fonctionne pas comme auparavant. git checkout.

479
David Smith

Sous [branch "master"], essayez d'ajouter ce qui suit dans le fichier de configuration Git du référentiel (.git/config):

[branch "master"]
    remote = Origin
    merge = refs/heads/master

Cela dit à Git 2 choses:

  1. Lorsque vous êtes sur la branche principale, la télécommande par défaut est Origin.
  2. Lorsque vous utilisez git pull sur la branche principale, sans aucune branche distante ni spécifiée, utilisez la valeur distante par défaut (Origin) et fusionnez les modifications à partir de la branche principale distante.

Je ne sais pas pourquoi cette configuration aurait été retirée de votre configuration, cependant. Vous devrez peut-être aussi suivre les suggestions que d'autres personnes ont postées, mais cela peut fonctionner (ou aider au moins).

Si vous ne souhaitez pas modifier le fichier de configuration à la main, vous pouvez utiliser l'outil de ligne de commande à la place:

$ git config branch.master.remote Origin
$ git config branch.master.merge refs/heads/master
727
mipadi

Si vous préférez, vous pouvez définir ces options via la ligne de commande (au lieu d’éditer le fichier de configuration) comme suit:

  $ git config branch.master.remote Origin
  $ git config branch.master.merge refs/heads/master

Ou, si vous êtes comme moi et que vous voulez que ce soit la valeur par défaut pour tous vos projets, y compris ceux sur lesquels vous pourriez travailler à l'avenir, ajoutez-le en tant que paramètre de configuration global:

  $ git config --global branch.master.remote Origin
  $ git config --global branch.master.merge refs/heads/master
139
Head
git branch --set-upstream master Origin/master

Cela ajoutera les informations suivantes à votre fichier config:

[branch "master"]
    remote = Origin
    merge = refs/heads/master

Si vous avez branch.autosetuprebase = always alors il ajoutera également:

    rebase = true
83
cmcginty

J'ai du mal à me souvenir des arguments exacts git config ou git branch comme dans les réponses de mipadi et de Casey. J'ai donc utilisé ces 2 commandes pour ajouter la référence en amont:

git pull Origin master
git Push -u Origin master

Cela ajoutera les mêmes informations à votre fichier .git/config, mais je trouve qu'il est plus facile à retenir.

50
Luke Sampson

( Git pull combine deux actions - extraire de nouveaux commits du référentiel distant dans les branches suivies, puis les fusionner en votre branche actuelle .

Lorsque vous avez extrait un commit particulier, vous n'avez pas de branche actuelle, vous n'avez que HEAD pointant vers le dernier commit que vous avez effectué. Donc, git pull n'a pas tous ses paramètres spécifiés. C'est pourquoi cela n'a pas fonctionné.

En fonction de vos informations mises à jour, vous essayez de restaurer votre référentiel à distance. Si vous connaissez le commit qui a introduit le bogue, le moyen le plus simple de le gérer consiste à utiliser git revert qui enregistre un nouveau commit qui annule le commit buggy spécifié:

$ git checkout master
$ git reflog            #to find the SHA1 of buggy commit, say  b12345
$ git revert b12345
$ git pull
$ git Push

Étant donné que c'est votre serveur que vous souhaitez modifier, je suppose que vous n'avez pas besoin de réécrire l'historique pour masquer la validation du buggy.

Si le bogue a été introduit dans une validation de fusion, cette procédure ne fonctionnera pas. Voir Comment inverser une fusion défectueuse .

23
Paul

Il y a aussi un moyen de configurer Git, donc, il tire et pousse toujours la branche distante équivalente vers la branche actuellement extraite vers la copie de travail. C'est ce qu'on appelle une branche de suivi qui git ready recommande le réglage par défaut .

Pour le prochain référentiel au-dessus du répertoire de travail actuel:

git config branch.autosetupmerge true

Pour tous les référentiels Git, qui ne sont pas configurés autrement:

git config --global branch.autosetupmerge true

Type de magie, à mon humble avis, mais cela pourrait aider dans les cas où le branche spécifique est toujours la branche actuelle.

Quand vous avez branch.autosetupmerge réglé sur true et que vous vérifiez une branche pour la première fois, Git vous expliquera comment suivre la branche distante correspondante:

(master)$ git checkout gh-pages
Branch gh-pages set up to track remote branch gh-pages from Origin.
Switched to a new branch 'gh-pages'

Git va ensuite pousser automatiquement vers cette branche correspondante:

(gh-pages)$ git Push
Counting objects: 8, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 1003 bytes, done.
Total 6 (delta 2), reused 0 (delta 0)
To [email protected]:bigben87/webbit.git
   1bf578c..268fb60  gh-pages -> gh-pages
10
Bengt

Ne voulant pas éditer mon fichier de configuration git, j'ai suivi l'info dans le post de @ mipadi et utilisé:

$ git pull Origin master
10
psynaptic

Votre question immédiate sur la façon de tirer le maître, vous devez faire ce qu’elle dit. Spécifiez le refspec à tirer de votre config de branche.

[branch "master"]
    merge = refs/heads/master
4
Ryan Graham