git: changer de branche sans détacher la tête

102

J'ai un référentiel sur github avec une branche principale (master) et une branche pour quelques travaux expérimentaux. J'ai fait quelques commits et poussé vers la branche expérimentale et tout allait bien.

Maintenant, sur une machine différente, j'essaye de cloner mon dépôt (git clone repository ) puis de passer à la branche expérimentale (git checkout branchname ) mais à chaque fois que je fais cela, ma tête se détache et je ne peux pas pousser mes changements. Qu'est-ce que je fais mal? J'ai l'impression qu'il me manque un concept git fondamental quelque part, mais la lecture de pages de manuel git aléatoires ne me donne aucun indice.

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

ÉDITER

Le concept d'une branche de suivi est ce qui me manquait. Maintenant que je connais ce concept, tout est clair. Personnellement, je trouve la git branch --tracksyntaxe beaucoup plus intuitive quegit checkout -b branch-name origin/branch-name .

Merci pour l'aide!

Dana Robinson
la source
Pour changer de branche sans détacher la tête, avec Git 2.23 (août 2019), utilisez git switch: voir ma réponse ci-dessous .
VonC

Réponses:

115
# 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 le nom local et le nom de la branche.
Lorsque vous avez vérifié, origin/branchnamevous ne retiriez pas vraiment une branche. origin/branchnameest un nom "distant", et vous pouvez en obtenir une liste avec

branch -a 

Si vous avez activé les couleurs, les branches locales seront d'une couleur et distantes une autre.

Vous devez d'abord faire un suivi local d'une branche distante afin de pouvoir y basculer et y travailler.

Kent Fredric
la source
9
Mec, pourquoi "git checkout origin / branchname" ne commence-t-il pas à suivre automatiquement la branche si elle n'est pas encore suivie?
Martin Konicek
4
car vous avez toujours besoin d'un nom local pour la succursale étrangère.
Kent Fredric
Voici ce que je fais et le message d'erreur: $ git checkout -b topic / fetch upstream / topic / fetch fatal: git checkout: la mise à jour des chemins est incompatible avec le changement de branche. Aviez-vous l'intention de récupérer 'upstream / topic / fetch' qui ne peut être résolu comme commit?
ulu
2
Merci pour le conseil sur les couleurs. Pour activer les couleurs:git config --global --add color.ui true
PonyEars
1
Il est intéressant de noter que "origine / nom de branche" peut littéralement être tout ce qui se résout en un SHA1, ou un SHA1 en lui-même =). J'utilise régulièrement cela pour créer des branches arbitraires avec des racines arbitraires.
Kent Fredric
16
git clone [email protected]:abc/def.git
cd def

Créez maintenant une branche de suivi:

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

Ensuite, après y avoir travaillé, appuyez simplement sur github en

git push
Christoph Rüegg
la source
3
git branch -t origin / experimental # n'a pas besoin de taper autant :)
Dustin
La branche que je souhaite suivre s'appelle topic / fetch. Quand j'essaye de faire $ git branch --track topic / fetch upstream / topic / fetch il dit, fatal: Pas un nom d'objet valide: 'upstream / topic / fetch'.
ulu
1
@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
1
@PDug% git checkout -t origin / experimental Branchement expérimental mis en place pour suivre la branche distante expérimentale à partir de l'origine en rebasant. Passé à une nouvelle branche `` expérimentale ''
Dustin
11

Pour développer la réponse de Kent, après avoir fait votre clonage, la seule branche que vous aurez (les télécommandes ne comptent pas) est celle qui était active dans le référentiel à partir duquel vous avez cloné - master dans votre cas.

Donc, vous voudrez d'abord créer une nouvelle branche pour suivre la branche expérimentale distante:

$ git branch experimental origin/experimental

puis vérifiez-le:

$ git checkout experimental

Cependant, Kent a raison - ces deux commandes peuvent être combinées

$ git checkout -b experimental origin/experimental
Pat Notz
la source
3

Avec Git 2.23 (août 2019), vous utiliseriez le git switch commande

Si vous avez une branche distante du même nom, elle sera automatiquement suivie:

$ git switch new-topic
Branch 'new-topic' set up to track remote branch 'new-topic' from 'origin'
Switched to a new branch 'new-topic'
VonC
la source