78 votes

Pourquoi a-git de nous mettre sur (pas de succursales)?

Ce matin nous tirer de notre repo, et git nous mettre sur (pas de succursales).

Je ne comprends pas, pourquoi est-ce arrivé? Et comment s'en sortir sans perdre nos changements?

106voto

Josh Lee Points 53741

"Actuellement pas sur n'importe quelle branche" signifie que vous avez une détaché de la tête, c'est à dire votre TÊTE pointeur est directement référencement de s'engager à la place de la symboliquement de pointer le nom de la branche.

Vous pouvez obtenir dans cette situation par la vérification d'un commit en SHA1, ou lorsque vous êtes au milieu d'un rebase, ou lorsqu'une fusion échoue. Il est difficile de dire ce que vous avez fait pour arriver dans cette situation par accident.

Il est dit que vous risquez de perdre vos modifications lorsque vous passez d'un décollement de la TÊTE d'une direction générale, mais le reflog vous permettra de toujours garder trace de l'endroit où votre TÊTE déplacé. En fait, Git 1.7.5 vous avertira lors de la commutation d'un décollement de la TÊTE se perdre s'engage. Le seul moment où vous pouvez vraiment perdre du travail, c'est quand vous avez des modifications non validées, vous pouvez engager ou de cachette.

Une façon simple de voir ce qui s'est passé est - git reflog ou git log -g --decorate pour une plus détaillé à l'inscription. L' --decorate option de l'étiquette de chaque SHA1 avec les noms de toutes les branches de ce point. Si le SHA1 de votre TÊTE est exactement le même que le maître, alors vous n'avez rien à faire, mais git checkout master revenir sur la bonne voie. Sinon, voir si le SHA1 est souligné par certains autre branche. Si non, vous voudrez peut-être créer une branche pour s'accrocher à elle.

Un autre bon de commande est - git branch -av, qui seront de même liste de toutes les branches et ce qu'ils désignent, de sorte que vous pouvez voir ce que votre (no branch) est vraiment censé être.

33voto

Chris Johnsen Points 50064

C'est difficile à dire sans plus de détails.

git pull extrait modifications sur le dépôt distant et effectue ensuite une fusion. Il peut être configuré pour faire un rebase au lieu d'une fusion (avec git pull --rebase, ou en configurant une véritable valeur pour l' branch.<branch_name>.rebase pour la branche dans laquelle vous êtes en tirant).

Si vous avez commencé sur une branche, tout de fusion de type pull toujours vous laisser sur cette branche. D'autre part, la commande rebase fonctionne toujours par à l'aide d'un détachement temporaire de la TÊTE (aka "pas de branche"). Si vous avez été laissé dans cet état pendant un rebase-type de traction, c'est parce que le rebase partie de la force d'attraction rencontré des conflits et il est en attente pour vous de les résoudre et de les utiliser rebase --continue (ou --skipou --abort).

Par défaut, le reflog magasins de chaque mise à jour est faite à la TÊTE (il peut aussi être un pour chaque direction). Vous pouvez consulter le reflog avec git reflog show (ou git log -g pour une plus détaillé). Il peut vous aider à déterminer comment vous vous êtes retrouvé dans cet état.

Si vous êtes au milieu d'un rebase (vous avez un .git/rebase-apply répertoire), puis il probablement arrêté pour vous permettre de résoudre certains conflits(s). Utiliser git status à cocher pour "dissociées". Ces entrées doivent avoir des marqueurs de conflit incorporés dans les fichiers (en supposant qu'ils sont de simples fichiers texte). Vous devriez les modifier pour résoudre le conflit(s) et de leur marque comme fusionnés en exécutant git add . Ensuite, exécutez git rebase --continue continuer avec le rebase. Vous pouvez exécuter en plus de conflits doivent être traités d'une manière similaire (modifier, ajouter, continuer). Si vous décidez que vous n'avez plus besoin d'un particulier d'engager, vous pouvez la passer avec git rebase --skip. Vous pouvez annuler l'ensemble de rebase avec git rebase --abort. L'ensemble de ces rebase commandes sont listées dans le message d'erreur lorsqu'un rebase s'arrête à cause d'un conflit. Une fois tous dans l'attente de la livraison n'ait été appliquée (ou ignoré), l'original de votre branche sera mis à jour avec la version définitive de la nouvelle commettre et votre TÊTE sera rattachée à elle (si vous l'abandonnez, votre TÊTE sera remis en place sans la mise à jour de la branche).

Si votre détaché de la TÊTE n'est pas en raison de conflits engagés dans le milieu d'un rebase, alors que votre TÊTE est détachée à un certain point avant le pull. Vous aurez besoin d'évaluer l'état actuel de l'arbre de décider ce que vous voulez faire. Vous pouvez utiliser git show-branch --current --all ou git log --graph --oneline --decorate --all ou un outil graphique comme gitk afin de savoir comment votre actuelle (détaché) de la TÊTE se rapporte à d'autres branches. Si vous décidez que vous souhaitez conserver le contenu de votre TÊTE, alors vous pouvez vous pouvez créer une nouvelle branche pour eux, avec des git branch new_branch_name. Si vous souhaitez remplacer une branche, puis utilisez git branch --force existing_branch_name. Ensuite, utilisez git checkout branch_name pour rattacher votre référentiel est à la TÊTE d'une direction générale.

2voto

VonC Points 414372

Notez que, dans le cas d'un "git pull --rebase" exécuter alors que l' HEAD est détachée, Git essayé de trouver de l'amont de la branche de l'détaché HEAD (qui, par définition, n'existe pas) et les émissions inutiles de messages d'erreur.

Ce n'est plus le cas avec Git1.8.0.1 (26 novembre 2012)

Voir à ce commit.

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