Je faisais du travail dans mon référentiel et j'ai remarqué qu'un fichier avait des changements locaux. Je n'en voulais plus, j'ai donc supprimé le fichier, pensant pouvoir simplement en extraire une nouvelle copie. Je voulais faire l'équivalent Git de
svn up .
L'utilisation git pull
ne semblait pas fonctionner. Des recherches aléatoires m'ont conduit à un site où quelqu'un a recommandé de faire
git checkout HEAD^ src/
( src
est le répertoire contenant le fichier supprimé).
Maintenant, je découvre que j'ai la tête détachée. Je n'ai aucune idée de ce que c'est. Comment puis-je annuler?
git checkout master
vous ramènera sur la branche principale. Si vous vouliez effacer les modifications de copie de travail, vous vouliez probablement le fairegit reset --hard
.git checkout -- src/
create temp branch - checkout temp branch - checkout master - delete temp branch
working copy changes
? Faites-vous référence aux modifications que vous avez apportées aux fichiers après avoir extrait un autre commit (c'est-à-dire les modifications que vous avez apportées dans un état de tête détaché)?Réponses:
Tête détachée signifie que vous n'êtes plus sur une branche, vous avez extrait un seul commit dans l'historique (dans ce cas, le commit précédent à HEAD, ie HEAD ^).
Si vous souhaitez supprimer vos modifications associées à la tête détachée
Vous avez seulement besoin de vérifier la branche où vous étiez, par exemple
La prochaine fois que vous avez modifié un fichier et que vous souhaitez le restaurer dans l'état où il se trouve dans l'index, ne supprimez pas le fichier en premier, faites simplement
Cela restaurera le fichier foo dans l'état où il se trouve dans l'index.
Si vous souhaitez conserver vos modifications associées à la tête détachée
git branch tmp
- cela enregistrera vos modifications dans une nouvelle branche appeléetmp
.git checkout master
master
, exécutez àgit merge tmp
partir de lamaster
branche. Vous devriez être sur lamaster
branche après avoir courugit checkout master
.la source
Previous HEAD position was 7426948...
Si vous avez modifié des fichiers que vous ne voulez pas perdre, vous pouvez les pousser. Je les ai validés en mode détaché et après cela, vous pouvez passer à une branche temporaire pour l'intégrer plus tard dans master.
Extrait de:
Que faire avec la validation effectuée dans une tête détachée
la source
git stash
? Car c'est la première chose qui me vient à l'esprit. la création d'une nouvelle succursale sera une exagération.git rebase my-temporary-work
supprimer la branchegit branch -d my-temporary-work
afin qu'elle apparaisse comme si vous vous êtes engagé en premier lieu dans la bonne branche.git stash
semble être l'outil parfait pour ce cas. Pourriez-vous s'il vous plaît écrire une réponse avec les étapes suggérées pour y parvenir?Une solution sans créer de branche temporaire.
Comment quitter («réparer») l'état HEAD détaché lorsque vous avez déjà modifié quelque chose dans ce mode et, éventuellement, souhaitez enregistrer vos modifications:
Validez les modifications que vous souhaitez conserver. Si vous souhaitez reprendre l'une des modifications que vous avez apportées dans l'état HEAD détaché, validez-les. Comme:
Ignorez les modifications que vous ne souhaitez pas conserver. La réinitialisation matérielle supprimera toutes les modifications non validées que vous avez apportées dans l'état HEAD détaché:
(Sans cela, l'étape 3 échouerait, se plaignant des fichiers non validés modifiés dans le HEAD détaché.)
Découvrez votre succursale. Quittez l'état HEAD détaché en vérifiant la branche sur laquelle vous avez travaillé auparavant, par exemple:
Reprenez vos engagements. Vous pouvez maintenant reprendre les commits que vous avez effectués dans l'état HEAD détaché par sélection à la cerise, comme indiqué dans ma réponse à une autre question .
la source
git reset --hard
était exactement étais - je besoin, parce que je veux en amont comme la source et les changements locaux doivent être enlevés.Tête détachée signifie:
Si vous n'avez aucun changement: vous pouvez passer en maître en appliquant la commande suivante
Si vous souhaitez conserver des modifications:
Dans le cas d'un HEAD détaché, valide le travail comme d'habitude, sauf qu'aucune branche nommée n'est mise à jour. Pour obtenir la branche principale mise à jour avec vos modifications validées, créez une branche temporaire où vous vous trouvez (de cette façon, la branche temporaire aura toutes les modifications validées que vous avez apportées dans la tête détachée), puis basculez vers la branche principale et fusionnez la branche temporaire avec le maître.
la source
Voici ce que je viens de faire après avoir réalisé que j'étais sur une tête détachée et que j'avais déjà fait quelques changements.
J'ai commis les changements.
Je me suis souvenu du hachage (1fe56ad) du commit. Ensuite, j'ai vérifié la branche où j'aurais dû être.
Enfin, j'ai appliqué les modifications du commit à la branche.
Je pense que c'est un peu plus facile que de créer une branche temporaire.
la source
git cherry-pick <hash>
.Si vous avez apporté quelques modifications, puis réalisé que vous étiez sur une tête détachée, il existe une solution simple pour cela: stash -> checkout master -> stash pop:
Vous aurez vos modifications non validées et votre tête "attachée" normale, comme si rien ne s'était passé.
la source
Lorsque vous extrayez un commit spécifique
git
, vous vous retrouvez dans un état de tête détachée ... c'est-à-dire que votre copie de travail ne reflète plus l'état d'une référence nommée (comme "master"). Ceci est utile pour examiner l'état passé du référentiel, mais pas ce que vous voulez si vous essayez réellement d'annuler les modifications.Si vous avez apporté des modifications à un fichier particulier et que vous souhaitez simplement les supprimer, vous pouvez utiliser la
checkout
commande comme ceci:Cela annulera toutes les modifications non validées et ramènera le fichier à l'état qu'il a dans la tête de votre branche actuelle. Si vous souhaitez supprimer les modifications que vous avez déjà validées, vous pouvez utiliser la
reset
commande. Par exemple, cela réinitialisera le référentiel à l'état de la validation précédente, ignorant toutes les modifications ultérieures:Cependant, si vous partagez le référentiel avec d'autres personnes, un
git reset
peut être perturbateur (car il efface une partie de l'historique du référentiel). Si vous avez déjà partagé des modifications avec d'autres personnes, vous voulez généralement regarder à lagit revert
place, ce qui génère un "anticommit" - c'est-à-dire qu'il crée un nouveau commit qui "annule" les modifications en question.Le Git Book contient plus de détails.
la source
git checkout path/to/foo
pourrait entrer en conflit avecgit checkout some-branch
, il serait donc préférable d'utilisergit checkout -- path/to/foo
pour éviter ces conflits.HEAD est dans un pointeur, et en conséquence, il pointe - directement ou indirectement - vers un commit particulier:
HEAD attaché signifie qu'il est attaché à une branche (c'est-à-dire qu'il pointe vers une branche).
Détaché un moyen de tête qu'il est pas attaché à une branche, à savoir qu'il pointe directement à certains commettras.
En d'autres termes:
Pour mieux comprendre les situations avec HEAD attaché / détaché, montrons les étapes menant au quadruplet d'images ci-dessus.
Nous commençons avec le même état du référentiel (les images dans tous les quadrants sont les mêmes):
Maintenant, nous voulons effectuer
git checkout
- avec différentes cibles dans les images individuelles (les commandes au-dessus d'eux sont grisées pour souligner que nous allons seulement appliquer ces commandes):Telle est la situation après avoir exécuté ces commandes:
Comme vous pouvez le voir, la HEAD pointe vers la cible du
git checkout
commande - vers une branche (les 3 premières images du quadruplet), ou (directement) vers un commit (la dernière image du quadruplet).Le contenu du répertoire de travail est également modifié pour être conforme à la validation appropriée (instantané), c'est-à-dire à la validation pointée (directement ou indirectement) par la HEAD.
Nous sommes donc maintenant dans la même situation qu'au début de cette réponse:
la source
Puisque "état de tête détaché" vous a sur une branche temporaire, utilisez simplement
git checkout -
ce qui vous place sur la dernière branche sur laquelle vous étiez.la source
git reflog
et peuvent être repris dans une nouvelle agence ou viagit cherry-pick
une agence existante. Voir cette question .Pour clarifier davantage la réponse de @Philippe Gerber, la voici:
Avant
cherry-pick
, ungit checkout master
est nécessaire dans ce cas. De plus, il n'est nécessaire qu'avec uncommit
indetached head
.la source
Addenda
Si la succursale dans laquelle vous souhaitez retourner était le dernier paiement que vous avez effectué, vous pouvez simplement utiliser
checkout @{-1}
. Cela vous ramènera à votre paiement précédent.En outre, vous pouvez alias cette commande avec, par exemple, de
git global --config alias.prev
sorte que vous avez juste besoin de tapergit prev
pour revenir à la caisse précédente.la source
Être en "tête détachée" signifie que HEAD fait référence à un commit spécifique sans nom (par opposition à une branche nommée) (cf: https://git-scm.com/docs/git-checkout section Tête détachée )
Pour résoudre le problème, il vous suffit de sélectionner la branche qui a été sélectionnée auparavant par
git checkout @{-1}
la source
Lorsque vous êtes dans une situation de tête détachée et que vous avez créé de nouveaux fichiers, assurez-vous d'abord que ces nouveaux fichiers sont ajoutés à l'index, par exemple avec:
Mais si vous avez seulement modifié ou supprimé des fichiers existants, vous pouvez ajouter (-a) et valider avec un message (-m) en même temps via:
Ensuite, vous pouvez simplement créer une nouvelle branche avec votre état actuel avec:
Vous aurez une nouvelle branche et tous vos ajustements seront là dans cette nouvelle branche. Vous pouvez ensuite continuer à pousser vers la télécommande et / ou à commander / tirer / fusionner à votre guise.
la source
Git m'a dit comment faire.
si vous avez tapé:
Enregistrez le statut
Alors:
la source
Je voulais garder mes changements donc je corrige ça
ça marche pour moi
la source
Pointe normalement
HEAD
sur une branche. Quand il ne pointe pas vers une branche à la place quand il pointe vers un hachage de validation comme69e51
cela signifie que vous avez un HEAD détaché. Vous devez pointer deux branches pour résoudre le problème. Vous pouvez faire deux choses pour y remédier.hash
la source
Une tête détachée signifie que vous n'avez pas extrait correctement votre branche ou que vous venez d'extraire un seul commit.
Si vous rencontrez un tel problème, stockez d' abord vos modifications locales afin de ne pas les perdre.
Après cela ... passez à la caisse de votre choix à l'aide de la commande:
Disons que vous voulez une branche MyOriginalBranch:
git checkout -b someName origin / MyOriginalBranch
la source
vous l'avez probablement fait
git reset --hard origin/your-branch
.Essayez de juste
git checkout your-branch
la source
travaillé pour moi. Il s'agissait simplement de donner explicitement le nom de la télécommande et de la branche.
la source
Dans mon cas, je cours
git status
et j'ai vu que j'avais quelques fichiers non suivis sur mon répertoire de travail.Je devais juste les nettoyer (car je n'en avais pas besoin) pour exécuter le rebase que je voulais effectuer.
la source
Cela fonctionne pour moi, il attribuera une nouvelle branche pour la tête détachée:
git checkout nouveau_nom_branché détaché_tête_garbage_nom
la source
Le HEAD détaché signifie que vous n'êtes actuellement sur aucune branche. Si vous souhaitez conserver vos modifications actuelles et simplement créer une nouvelle branche, voici ce que vous faites:
Par la suite, vous pouvez potentiellement fusionner cette nouvelle branche avec d'autres branches. La commande git "a dog" est toujours utile :
la source