2009-01-22 2 views
75

J'ai un référentiel sur github avec une branche principale (master) et une branche pour un travail expérimental. J'ai fait quelques commits et poussé à la branche expérimentale et tout allait bien.git: branche de commutation sans tête de détachement

Maintenant, sur une autre machine, j'essaie de cloner mon dépôt (clone git de dépôt), puis passer à la branche expérimentale (git checkout de branchname), mais chaque fois que je fais cela ma tête se détache et je ne peut pas pousser mes changements. Qu'est-ce que je fais mal? J'ai l'impression de manquer un concept fondamental de git quelque part mais lire des pages man git au hasard ne me donne aucun indice.

Je suis nouveau à git alors je suis désolé si je suis un idiot mais je ne trouve rien dans les docs qui m'aidera à rattacher ma tête.

EDIT

Le concept d'une branche de suivi est ce que je manque. Maintenant que je croque ce concept, tout est clair. Personnellement, je trouve la syntaxe git branch --track beaucoup plus intuitive que git checkout -b branch-name origin/branch-name.

Merci pour l'aide!

Répondre

88
# first time: make origin/branchname locally available as localname 
git checkout -b localname origin/branchname 

# othertimes 
git checkout localname 

git push origin 

Pour plus de commodité, vous pouvez utiliser la même chaîne pour localname & branchname
Lorsque vous vérifié origin/branchname vous ne vérifiez pas vraiment une branche. origin/branchname est un nom « à distance », et vous pouvez obtenir une liste avec

branch -a 

Si vous avez des couleurs est activée, les branches locales seront une couleur, et une autre à distance.

Vous devez d'abord effectuer le suivi local d'une branche distante afin de pouvoir basculer et travailler dessus.

+5

Homme, pourquoi "git checkout origin/branchname" commence à suivre le soutien-gorge nch automatiquement s'il n'est pas encore suivi? –

+2

car vous avez toujours besoin d'un nom local pour la succursale étrangère. –

+0

Voici ce que je fais, et le message d'erreur: $ git checkout -b sujet/récupérer en amont/topic/fetch fatal: git checkout: la mise à jour des chemins est incompatible avec le changement de branche. Avez-vous eu l'intention de vérifier 'upstream/topic/fetch' qui ne peut pas être résolu en commit? – ulu

12
git clone [email protected]:abc/def.git 
cd def 

maintenant créer une branche de suivi:

git branch --track experimental origin/experimental 
git checkout experimental 

Puis, après y travailler, il suffit de pousser à github par

git push 
+3

branche git -t origine/expérimental # n'a pas besoin de taper autant :) – Dustin

+0

La branche que je veux suivre s'appelle topic/fetch. Quand j'essaie de faire $ git branch - topic de la rubrique/fetch upstream/topic/fetch il est dit, fatal: N'est pas un nom d'objet valide: 'upstream/topic/fetch'. – ulu

+0

@Dustin, cette commande crée une branche locale 'origin/experimental' qui suit le maître local. Je suppose que c'est une erreur assez courante. – PDug

10

Pour développer la réponse de Kent, une fois que vous faites votre clone le seule la branche que vous aurez (les télécommandes ne comptent pas) est celle qui était active dans le dépôt que vous avez cloné - master dans votre cas.

Alors, d'abord, vous aurez envie de créer une nouvelle branche pour suivre la branche expérimentale à distance:

$ git branch experimental origin/experimental 

puis vérifier:

$ git checkout experimental 

Cependant, Kent est correct - ces deux commandes peuvent être combinées

$ git checkout -b experimental origin/experimental 
Questions connexes