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 (wich does complete because there was some error due to the fact that i'm no more on master)
Parce que git m'a dit que je pouvais m'engager quand j'étais dans un état isolé, je l'ai fait . Mais maintenant, je veux aimer fusionner ma branche détachée et ma branche maître locale, puis transmettre mes modifications à l'origine /maîtriser.
Ma question est donc de savoir comment puis-je fusionner la branche principale avec mon état actuel (tête détachée)
Créez une branche où vous êtes, puis passez à master et fusionnez-la:
git branch my-temporary-work
git checkout master
git merge my-temporary-work
Vous pouvez 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 temproary branch
git branch -d tmp
Encore plus simple serait
git checkout master
git merge HEAD@{1}
mais cela comporte le léger risque que, si vous commettez une erreur, il peut être un peu plus difficile de récupérer les erreurs commises sur la tête détachée.
Vous pouvez simplement faire git merge <commit-number>
ou git 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
C'est ce que j'ai fait:
Fondamentalement, considérez le detached HEAD
comme une nouvelle branche, sans nom. Vous pouvez vous engager dans cette branche comme n'importe quelle autre branche. Une fois que vous avez terminé, vous voulez le pousser vers la télécommande.
La première chose à faire est donc de donner un nom à ce detached HEAD
. Vous pouvez facilement le faire comme, tout en étant sur ce detached HEAD
:
git checkout -b some-new-name
Maintenant, vous pouvez le pousser à distance comme n'importe quelle autre branche.
Dans mon cas, je voulais aussi 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 était
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 pour master
.
C'est à peu près ça.
Dans le cas où HEAD est détaché, les commits fonctionnent normalement, sauf qu'aucune branche nommée n'est mise à jour. Pour que la branche principale soit mise à jour avec vos modifications validées, créez une branche temporaire à votre emplacement le maître.
git branch temp
git checkout master
git merge temp
J'ai également fondé un article dans lequel il est expliqué comment traiter ... Je l'ajoute car il diffère un peu de ce qui a été proposé ... Mais je pense que toutes les propositions sont valables
http://edspencer.net/2009/10/git-what-to-do-if-you-commit-to-no-branch.html
Plus tard, j'accepterai la première réponse comme étant la bonne
Peut-être pas la meilleure solution (réécrira l’historique) mais vous pourriez aussi faire git reset --hard <hash of detached head commit>
.
Une solution facile consiste simplement à créer une nouvelle branche pour cette validation et à la récupérer: git checkout -b <branch-name> <commit-hash>
.
De cette manière, 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 d’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. Assurez-vous de consulter cet article pour une meilleure illustration de détaché HEAD state.