Pourquoi ma 'git branch' n'a-t-elle pas de maître?

94

Je suis un git newbie et je continue à lire sur une branche "master". Est-ce que «maître» est juste un nom conventionnel utilisé par les gens ou at-il une signification particulière HEAD?

Quand je fais git branchsur le clone que j'ai, je ne vois qu'une seule branche - celle sur laquelle je suis. Pas de "maître" du tout. Si je tape git checkout master(comme je le vois dans de nombreux tutoriels ou guides), j'obtiens

error: pathspec 'master' did not match any file(s) known to git.

Je ne comprends simplement pas pourquoi mon clone n'a pas masterque tout le monde semble impliquer qu'il existe toujours.

aberrant80
la source

Réponses:

73

La plupart des dépôts Git utilisent mastercomme branche principale (et par défaut) - si vous initialisez un nouveau dépôt Git via git init, il aura masterété extrait par défaut.

Cependant, si vous clonez un référentiel, la branche par défaut que vous avez est celle HEADvers laquelle pointe la télécommande ( HEADc'est en fait une référence symbolique qui pointe vers un nom de branche). Donc, si le référentiel que vous avez cloné avait un HEADpointé, par exemple foo, alors votre clone n'aura qu'une foobranche.

La télécommande à partir de laquelle vous avez cloné peut toujours avoir une masterbranche (vous pouvez vérifier avec git ls-remote origin master), mais vous n'auriez pas créé une version locale de cette branche par défaut, car git clonene vérifie que la télécommande HEAD.

ambre
la source
6
Et puis comment commander le maître d'origine s'il existe?
Bunyk
comment définir HEAD pour maître
Matt Smith
32
J'ai créé mon dépôt avec git init et la branche master n'a pas été créée. Avec Github, la branche est créée automatiquement, mais pas avec Bitbucket. Les étapes Mising étaient: git add ., git commit -m "Test"puis git push -u origin master.
Shailen
12
@Amber J'obtiens cette erreur "fatal: master: not a valid SHA1"
KK_07k11A0585
1
@Amber git ls-remote origin masterne montre rien.
Parisa Khateri
86

Pour extraire une branche qui n'existe pas localement mais qui se trouve dans le dépôt distant, vous pouvez utiliser cette commande:

git checkout -t -b master origin/master
Bunyk
la source
Merci d'avoir essayé de vous aider, même si cette question est assez ancienne. Mais votre réponse n'était pas ce que je demandais.
aberrant80 le
fatal: Cannot update paths and switch to branch 'master' at the same time.
Raphael Onofre
Correction sur github créant une branche principale et paramètre par défaut
Raphael Onofre
45

master est juste le nom d'une branche, il n'y a rien de magique à ce sujet sauf qu'il est créé par défaut lors de la création d'un nouveau référentiel.

Vous pouvez le rajouter avec git checkout -b master.

Matt Curtis
la source
git checkout -b masterajoute juste une nouvelle branche à celle actuelle pour moi.
nnyby
1
@nnyby git checkout -b mastercréera une masterbranche à partir de ce qui HEADest - donc si vous êtes sur une autre branche, cela créera une masterbranche à partir de cela. Sauf si vous avez déjà une masterbranche (ce que vous aurez, sauf si par exemple vous l'avez supprimée ou ne vous y êtes jamais engagée). Si vous avez déjà une masterbranche, cette commande vous donnera juste une erreur.
Matt Curtis
2
Ma question est la suivante: comment ai-je accidentellement supprimé le maître?
Eric Walker
@EricWalker mastern'est qu'une branche, qui peut être supprimée avec git branch -d master. Bien que git vous protège de la suppression de la branche sur laquelle vous vous trouvez actuellement, rien de spécial ne protège la masterbranche. Plus précisément, il est difficile de dire comment vous l'avez fait. Peut-être utilisez-vous la historycommande de votre shell pour jeter un coup d'œil?
Matt Curtis
1
Bonjour @MattCurtis, votre réponse est actuellement trompeuse. git checkout -b masterne fonctionnera que lorsque HEAD est réglé sur origine / maître. Dans tous les autres cas (par exemple, vous êtes sur 'develop'), git checkout -b mastercréera une branche nommée 'master' qui est basée sur la position actuelle de HEAD (par exemple à partir de 'develop'). Vous devez également indiquer quelle branche sera la base de la nouvelle. @Bunyk a la bonne réponse sur ce fil: stackoverflow.com/a/21330943/287109
AVIDeveloper
23

J'ai en fait eu le même problème avec un tout nouveau référentiel. J'avais même essayé d'en créer un avec git checkout -b master, mais cela ne créerait pas la branche. J'ai alors réalisé que si je faisais des changements et les validais, git créait ma branche master.

eacousineau
la source
1
La partie trompeuse est que les gens disent que j'ai le maître, mais quoi que j'essaye de faire, j'obtiendrais des messages d'erreur disant que je n'ai pas le maître. (J'essayais de créer une branche de développement alors que mon dépôt était encore vide.) En validant quelque chose (n'importe quel fichier), le maître a maintenant vu le jour, et j'ai pu continuer à faire d'autres choses. J'ai essayé les choses dans les autres réponses, mais rien n'a aidé. Cette seule réponse ici peut s'appliquer à de nombreuses personnes. (J'ai beaucoup lu sur le hachage dans Git. Je suppose que s'il n'y a rien au début, il n'y a rien à hacher.)
Fai Ng
15

Dans mon cas, il y avait une branche develop mais pas de branche master . Par conséquent, j'ai cloné le référentiel en pointant le HEAD nouvellement créé vers la branche existante. Ensuite, j'ai créé la branche principale manquante et mis à jour HEAD pour pointer vers la nouvelle branche principale.

git clone git:repositoryname --branch otherbranch
git checkout -b master
git update-ref HEAD master
git push --set-upstream origin master
Antoniob
la source
Ah on y va .. Je n'avais pas de maître ou quoi que ce soit. J'ai d'abord ajouté un nouveau fichier et un commit initial - puis je l'ai fait. A travaillé comme un charme
Dustin Silk
12

s'il s'agit d'un nouveau dépôt que vous avez cloné, il peut encore être vide, auquel cas:

git push -u origin master

devrait probablement régler le problème.

(fait dans mon cas. Je ne suis pas sûr que ce soit le même problème, j'ai pensé que je devrais publier ceci juste au cas où. pourrait aider les autres.)

chiffre
la source
8

J'ai rencontré le même problème et compris le problème. Lorsque vous initialisez un référentiel, il n'y a en fait aucune branche. Lorsque vous démarrez une course de projet git add ., puis git commitet la branche principale sera créé.

Sans rien vérifier, vous n'avez pas de branche principale. Dans ce cas, vous devez suivre les étapes suggérées par d'autres personnes ici.

Nick ONeill
la source
2
vrai. faites un "git init" suivi de "git checkout -b somebranchname" et vous n'aurez pas de branche master
koem
Cela peut également ne pas être suffisant si le dossier est vide. Donc, pour que cela fonctionne, vous devez ajouter des fichiers. Cette autre maladresse est en fait décevante.
alehro
0

Il semble qu'il doit y avoir au moins un commit local sur la branche master à faire:

git push -u origin master

Donc, si vous l'avez fait git init .et ensuite git remote add origin ..., vous devez toujours faire:

git add ...
git commit -m "..."
Zelphir Kaltstahl
la source