494 votes

Comment faire pour que git tire toujours d'une branche spécifique ?

Je ne suis pas un maître de git, mais je travaille avec depuis un certain temps maintenant, avec plusieurs projets différents. Dans chaque projet, j'ai toujours git clone [repository] et à partir de ce point, on peut toujours git pull tant que je n'ai pas de changements en suspens, bien sûr.

Récemment, j'ai dû revenir à une branche précédente, et je l'ai fait avec git checkout 4f82a29 . Lorsque j'étais à nouveau prêt à tirer, j'ai constaté que je devais remettre ma branche sur master. Maintenant, je ne peux pas tirer en utilisant un simple git pull mais à la place, il faut spécifier git pull origin master ce qui est ennuyeux et m'indique que je ne comprends pas bien ce qui se passe.

Qu'est-ce qui a changé et qui ne me permet pas de faire un simple git pull sans spécifier le maître d'origine, et comment le changer à nouveau ?

UPDATE :

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

MISE À JOUR 2 : Pour être clair, je comprends que ma méthode originale peut avoir été incorrecte, mais j'ai besoin de corriger ce repo afin que je puisse simplement utiliser git pull à nouveau. Actuellement, le résultat de git pull est :

-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 à l'origine, avant que mon git checkout .

0 votes

A quoi ressemble votre .git/config ? Qu'avez-vous fait après avoir vérifié ce commit ?

0 votes

Avez-vous fait des commits sur le dessus de 4f82a29 ?

0 votes

Pat, je n'ai pas fait de commits en plus. C'est sur un serveur, et nous avions besoin de revenir à une version stable afin de cacher un bug que nous avions créé. Ce système n'est pas destiné au développement, je voulais donc simplement revenir en arrière, attendre que le bogue soit corrigé, puis revenir à la version principale.

740voto

mipadi Points 135410

Sous [branch "master"] essayez d'ajouter ce qui suit au fichier de configuration Git du repo ( .git/config ) :

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

Cela dit deux choses à Git :

  1. Lorsque vous êtes sur la branche master, le distant par défaut est origin.
  2. Lorsque vous utilisez git pull sur la branche maîtresse, sans spécifier de branche et de distant, utiliser le distant par défaut (origine) et fusionner les changements de la branche maîtresse distante.

Je ne suis pas sûr de la raison pour laquelle cette installation aurait été supprimée de votre configuration, cependant. Il se peut que vous deviez suivre les suggestions que d'autres personnes ont postées, mais cela peut fonctionner (ou du moins vous aider).

Si vous ne voulez 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

2 votes

Cela a également fonctionné pour moi, j'avais récupéré un projet sur github. Je suis sous OS X 10.4

0 votes

Merci. très beaucoup - cela m'est arrivé sur un projet à un seul développeur avec un dépôt "serveur" et deux ordinateurs (que j'utilisais pour pousser/tirer fréquemment sans problème avant le pépin), je ne sais pas pourquoi, mais la correction a bien fonctionné !

0 votes

Voir la réponse par Head pour éviter de devoir éditer le fichier de configuration à la main

141voto

Head Points 2233

Si vous préférez, vous pouvez définir ces options via la ligne de commande (au lieu de modifier 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-la comme paramètre de configuration global :

  $ git config --global branch.master.remote origin
  $ git config --global branch.master.merge refs/heads/master

12 votes

+1 pour avoir connu le mot magique "refs/heads/master". Je n'ai pas eu de mal à trouver comment définir la variable, mais je n'avais absolument aucune idée de ce qu'il fallait définir à et les pages de manuel ne sont pas d'une grande aide. J'ai fini par trouver le bon endroit dans la documentation après avoir trouvé cette réponse. Pour les curieux : le mot magique se réfère à un chemin de fichier dans .git dans lequel git semble conserver le code de hachage de master s current commit.

86voto

Casey Points 19286
git branch --set-upstream master origin/master

Cela ajoutera l'information suivante à votre config fichier :

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

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

    rebase = true

1 votes

Je trouve que c'est la façon la plus simple de faire en sorte que git se comporte comme demandé, surtout s'il y a plusieurs branches, et pas seulement des branches distantes (même si vous devez faire cela pour chaque branche, c'est une fois par branche).

2 votes

Je viens d'essayer, et j'obtiens l'erreur suivante fatal: Not a valid object name: 'origin/master'. même si origin est une télécommande valide, et master existe, comme d'habitude, dans les deux dépôts.

2 votes

Ken, tu dois d'abord faire "git fetch origin" pour obtenir les noms des branches distantes.

53voto

Luke Sampson Points 3359

Je trouve difficile de me souvenir de l'exacte git config ou git branch comme dans les réponses de mipadi et Casey, j'utilise donc ces 2 commandes pour ajouter la référence amont :

git pull origin master
git push -u origin master

Cela ajoutera les mêmes informations à votre .git/config, mais je trouve cela plus facile à retenir.

1 votes

Je suis d'accord. Cela devrait être la meilleure réponse la plus simple.

2 votes

Votre réponse doit inclure la raison pour laquelle cela fonctionne et faire référence à la section dans les docs qui explique pourquoi.

24voto

Paul Points 12977

Git pull combine deux actions -- récupérer les nouveaux commits du dépôt distant dans les branches suivies et ensuite les fusionner dans votre branche actuelle .

Lorsque vous extrayez un commit particulier, vous n'avez pas de branche courante, vous n'avez qu'un HEAD pointant sur le dernier commit que vous avez fait. Donc git pull n'a pas tous ses paramètres spécifiés. C'est pour cela qu'elle n'a pas fonctionné.

Sur la base de vos informations mises à jour, ce que vous essayez de faire est de rétablir votre dépôt distant. Si vous connaissez le commit qui a introduit le bogue, la manière la plus simple de gérer cela est avec git revert qui enregistre un nouveau commit qui annule le commit bogué spécifié :

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

Puisque c'est votre serveur que vous voulez modifier, je suppose que vous n'avez pas besoin de réécrire l'historique pour cacher le commit bogué.

Si le bogue a été introduit dans un commit de fusion, alors cette procédure ne fonctionnera pas. Voir How-to-revert-a-faulty-merge (en anglais) .

0 votes

Vous me donnez de bonnes informations, ce que j'apprécie, mais je ne décris peut-être pas très bien ma situation, et cela ne correspond pas exactement à mon flux de travail. Je vais probablement poster une autre question pour y répondre. Merci quand même, Paul ! +1 à vous, Monsieur.

0 votes

J'ai juste mal interprété votre situation. Je suis heureux que vous ayez obtenu la réponse dont vous aviez besoin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X