Que faire avec la validation effectuée dans une tête détachée


281

En utilisant git, j'ai fait quelque chose comme ça

git clone
git checkout {a rev number tree rev before} (here I started to be in a detached head state)
//hacking
git commit
//hacking
git commit
(some commit where made on origin/master)
git pull (which does complete because there was some error due to the fact that I'm no more on master)

Parce qu'il m'a dit que je pouvais encore m'engager dans un état de tête détachée, je l'ai fait. Mais maintenant, je veux fusionner ma branche principale détachée et ma branche principale locale, puis pousser mon groupe de modifications vers origine / maître.

Donc, ma question est de savoir comment fusionner la branche principale avec mon état actuel (tête détachée)



Si vous pouviez ajouter une capture d'écran d'un arbre de commit dans cet état (à quoi ressemble un commit sur une tête détachée dans gitk ou SourceTree), cela rendrait cette question encore meilleure.
florisla

Malheureusement pour le moment, je ne peux pas, mais si vous pouvez continuer, je serai heureux de le voir ici. Même si c'est un tirage au sort, ça sera plus clair
benzen

Réponses:


478

Créez une branche où vous êtes, puis passez en master et fusionnez-la:

git branch my-temporary-work
git checkout master
git merge my-temporary-work

12
comment éviter de détacher des têtes à l'avenir?
ycomp

Je l'ai fait et je me suis retrouvé en avance sur l'origine par 5 commits. Dans ce cas, ne faites-vous que git push origin?
Winnemucca

5
étrange, je reçois "Déjà à jour." lors de la fusion de mon-travail-temporaire
Robert Sinclair

10
N'oubliez pas de supprimer mon-travail-temporaire avec "git branch -d mon-travail-temporaire"
Captain Lepton

5
@ycomp "tête détachée" se produit lorsque vous modifiez les fichiers d'un ancien commit puis validez ceux sans branche pour référencer ce nouveau commit plus tard. Pour éviter la tête détachée, ne récupérez pas les anciens commits. Si vous voulez toujours tous les fichiers à partir de là, mais en tant que nouveau commit, vous pouvez extraire le répertoire du commit, au lieu du commit lui-même. Voir cette réponse
lucidbrot

96

Vous pourriez faire quelque chose comme ça.

# Create temporary branch for your detached head
git branch tmp

# Go to master
git checkout master

# Merge in commits from previously detached head
git merge tmp

# Delete temporary branch
git branch -d tmp

Encore plus simple serait

git checkout master
git merge HEAD@{1}

mais cela a le léger danger que si vous faites une erreur, il peut être un peu plus difficile de récupérer les commits effectués sur la tête détachée.


4
Je sais que c'est des années plus tard, mais merci pour cette réponse. Je ne me considérais pas comme ayant fait la recherche avec la réponse acceptée ici parce que je ne voulais pas laisser une branche temporaire et cette réponse a la commande pour la supprimer.
Jeremy Pridemore

8
Si vous décidez d'utiliser la commande, git merge HEAD@{1}vous devriez probablement vous assurer que c'est celle que vous souhaitez utiliser en utilisantgit reflog
Michael Stramel

3
La possibilité de fusionner HEAD @ {1} m'a sauvé la vie car j'avais déjà vérifié Master de manière préventive.
juil

étrange, je reçois "Déjà à jour." lors de la fusion de tmp (mais les fichiers sont différents)
Robert Sinclair

19

C'est ce que j'ai fait:

Fondamentalement, considérez le detached HEADcomme une nouvelle branche, sans nom. Vous pouvez vous engager dans cette branche comme n'importe quelle autre branche. Une fois que vous avez fini de vous engager, vous voulez le pousser vers la télécommande.

Donc, la première chose que vous devez faire est de lui donner detached HEADun nom. Vous pouvez facilement le faire comme, tout en étant sur ceci detached HEAD:

git checkout -b some-new-branch

Vous pouvez maintenant le pousser à distance comme n'importe quelle autre branche.

Dans mon cas, je voulais également avancer rapidement cette branche à maîtriser avec les commits que j'ai faits dans le detached HEAD(maintenant some-new-branch). Tout ce que j'ai fait, c'est

git checkout master

git pull # To make sure my local copy of master is up to date

git checkout some-new-branch

git merge master // This added current state of master to my changes

Bien sûr, je l'ai fusionné plus tard master.

C'est à peu près ça.


1
Cette réponse a fonctionné pour moi là où les autres ne l'ont pas fait. git checkout -b new-branchtravaillé pour moi. Les autres suggestions s'imposaient git branch new-branch, mais cela me laissait toujours dans la tête détachée et la nouvelle branche n'a pas repris mes changements.
Jesse Patel

17

Vous pouvez simplement faire git merge <commit-number>ougit cherry-pick <commit> <commit> ...

Comme suggéré par Ryan Stewart, vous pouvez également créer une branche à partir du HEAD actuel:

git branch brand-name

Ou juste un tag:

git tag tag-name

Vous pouvez trouver votre numéro de commit sur la tête détachée pargit rev-parse HEAD
KOGI

6

En cas de HEAD détaché, le travail est validé 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 passez à la branche principale et fusionnez la branche temporaire avec le maître.

git branch  temp
git checkout master
git merge temp

3

Une solution facile est de simplement créer une nouvelle branche pour ce commit la caisse à elle: git checkout -b <branch-name> <commit-hash>.

De cette façon, toutes les modifications que vous avez apportées seront enregistrées dans cette branche. Au cas où vous auriez besoin de nettoyer votre branche principale des commits restants, assurez-vous de l'exécuter git reset --hard master.

Avec cela, vous allez réécrire vos branches alors assurez-vous de ne déranger personne avec ces changements. N'oubliez pas de consulter cet article pour une meilleure illustration de l' état HEAD détaché .


1

Ce n'est peut-être pas la meilleure solution (réécrira l'historique) mais vous pourriez aussi le faire git reset --hard <hash of detached head commit>.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.