web-dev-qa-db-fra.com

Je ne peux pas commander une branche spécifique ", détaché HEAD Etat"

Mon ami et moi avons un repo qu'il a créé. Il a ensuite créé une branche appelée "lexer" sur laquelle nous travaillons.

Le problème est qu’il peut basculer entre maître et lexer mais que cela ne fonctionne pas du tout pour moi.

Finalement, je viens juste de recommencer (rm -rf repo et ensuite cloné le référentiel) mais il est toujours impossible de vérifier la branche lexer?

Sur un repo fraîchement cloné:

git branch donne:

$ git branch
* master

git checkout lexer donne:

$ git checkout lexer
$ git status
On branch master
Your branch is up-to-date with 'Origin/master'.

Je peux payer Origin/lexer mais je me retrouve dans un état détaché HEAD?

$ git checkout Origin/lexer master
Note: checking out 'Origin/lexer'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

Il m'est possible de pousser vers la branche lexer en faisant

git Push Origin HEAD:lexer

mais bon, je voudrais vraiment régler ce gâchis. C'est tellement bizarre que ça marche pour lui mais pas pour moi? Il dit qu'il n'a pas non plus de changements locaux dans le dépôt git ...

Quelqu'un a un indice?

19
mnordber

Je vais essayer de deviner que vous avez un répertoire nommé lexer au niveau supérieur. Puisque git checkout est utilisé à la fois pour changer de branche et pour réinitialiser les fichiers de l’arborescence, il détecte probablement que vous n’avez pas de branche appelée lexer mais que vous avez un chemin et que vous sélectionnez le second mode . Cela fonctionne pour votre ami car il a déjà une branche lexer.

La solution la plus simple consiste probablement à créer la branche en utilisant git branch à la place.

git branch --track lexer Origin/lexer

devrait le faire pour vous. Vous pouvez ensuite utiliser git checkout pour y accéder.

Une autre option pourrait être d'utiliser l'indicateur -- pour effectuer le paiement. Je n'ai pas essayé mais je pense que ça devrait marcher:

git checkout lexer --

Lorsque vous ajoutez --, le mot qui le précède est toujours considéré comme une branche/commit/arbre et le mot après un chemin.

32
Per Johansson

Vous ne pouvez pas extraire lexer car vous n’avez pas la branche dans votre référentiel local (et sûrement un dossier du même nom). Vous n'avez que la branche distante 'Origin/lexer'. Vous devez d’abord créer la branche locale:

git checkout -b lexer Origin/lexer

Une bonne explication sur le sujet: https://git-scm.com/book/en/v2/Git-Branching-Remote-Branches#Tracking-Branches

7
Philippe

Vous entrez dans un état HEAD détaché car Origin/lexer est une branche de suivi à distance, et donc en lecture seule. Vous voulez simplement valider lexer et faire votre travail à ce sujet. Ensuite, lorsque vous appuyez sur, Origin/lexer sera mis à jour.

Edit : En relisant votre question, je constate que vous avez essayé de récupérer Lexer, mais que vous restez en mode maître. Il est étrange que git checkout échoue silencieusement. Essayez git checkout -t Origin/lexer.

3
David Deutsch

Vous voulez probablement ceci:

git checkout -t Origin/lexer

De git manuel:

Par commodité, --track without -b implique la création de branches ...

et

-t, --track ... Lors de la création d'une nouvelle branche, configurez la configuration "en amont" ... Si aucune option -b n'est donnée, le nom de la nouvelle branche sera dérivé de la branche de suivi à distance.

2
Denis Pshenov

Une autre supposition sauvage: vous rencontrez une étiquette avec un nom identique alors

git checkout lexer

vérifie réellement l'étiquette, pas la branche

0

Quand vous faites: git checkout Origin/lexer master vous changez simplement votre HEAD pour qu'il pointe vers le dernier commit dans notre branche remote. C'est une branche en lecture seule.

Si vous souhaitez comprendre ce que HEAD lit ceci:
Comment déplacer HEAD vers un emplacement précédent? (Tête détachée)

Dans votre cas, vous devez simplement procéder comme suit:

Mettez à jour votre référentiel avec le dernier code avec toutes les branches et balises

# Update your local repository with all the remote branches
# --Prune = remove all deleted data locally which was removed on the remote
git fetch --all --Prune

Maintenant, vous devriez avoir les dernières branches localement.

Supprimer l'ancienne branche locale

!!! IMPORTANT:
Si vous avez apporté des modifications sans les pousser, ne supprimez pas la branche locale

git branch -D lexer 

Commander la branche souhaitée

# don't use the remote simply the branch name
git checkout lexer 

Maintenant, vous avez une branche locale avec le nom Lexer extrait de votre branche distante

0
CodeWizard