web-dev-qa-db-fra.com

Comment "déplacer" mes validations de "pas de branche" vers une branche réelle?

J'ai fait une erreur et j'ai commencé à faire des commits "jusqu'à la dernière balise", ce qui fait que mes commits sont "sans branche". Ils auraient dû être appliqués à la tête d'une succursale déjà existante. J'ai pas encore poussé mes changements. J'ai trouvé quelques autres questions pour savoir quand les validations sont dans la branche erronée, mais maintenant j'ai non branche, donc je ne sais pas comment gérer cela.

De préférence, je voudrais effacer complètement mon erreur et "déplacer" mes modifications à la fin de la branche de droite. Si je dois laisser mon erreur dans l'histoire, je dois les fusionner au moins.

37
Letharion

Vous êtes actuellement dans un état HEAD détaché. Pour résoudre ce problème, il vous suffit de créer une nouvelle branche avec git branch <branchname> ou git checkout -b <branchname>. Cela vous laissera une branche locale avec laquelle vous pourrez jouer, et même la supprimer lorsque vous en aurez terminé.

Les branches dans git ne sont que pointeurs pour les commits, donc si vous créez une nouvelle branche où vous êtes, la nouvelle branche pointera vers votre commit actuel, puis vous peut le fusionner ou autre chose.

Votre "erreur" doit ne pas être effacée, vous avez simplement créé de nouveaux commits en plus des précédents. Vous n'avez pas modifié l'historique ou quelque chose comme ça.

EDIT: En réponse à votre commentaire, ce que vous devez faire est:

git branch temp
git checkout master # or any other branch
git merge temp
git branch -d temp
68
drrlvn

Vous pouvez afficher tous vos validations à l'aide de git reflog

Vous pouvez donc simplement accéder à une autre branche et faire git cherry-pick <commit-hash> pour les validations requises.

Mais je préfère le chemin de la branche comme spatz mentionné.

16
Sailesh

Remarque: vous avez également

enter image description here

Dans les deux cas, faire une branche tmp et la fusionner de nouveau à la branche réelle est la solution.

7
VonC

Une autre solution, qui n'implique pas la création d'une branche temporaire, est décrite ici . Vous fusionnez simplement avec votre dernier commit plutôt qu'avec une branche temporaire.

$ git checkout master
$ git merge d2bdb98

Si vous ne savez pas sur quel commit vous êtes, vous pouvez le trouver avec git log . Je ne sais pas si cette solution est différente de la "sélection des cerises" mais elle a eu les résultats escomptés pour moi.

5
Nathan Buesgens

Je viens d'avoir une situation où j'avais une branche master sur laquelle je voulais m'engager, mais accidentellement engagée dans une HEAD détachée (notez que le hachage de validation n'est pas important ici, mais juste pour illustrer la situation):

$ git branch
* (detached from 29d2cfb)
  master

Voici ma solution rapide:

$ git branch -f master HEAD
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'Origin/master' by 1 commit.
  (use "git Push" to publish your local commits)

Part de gâteau.

Notez que cette astuce ne fonctionne que si master a initialement pointé sur le même commit que vous avez fait votre commit erroné. Si ce n'est pas le cas, vous devrez rebaser (ou choisir, ou fusionner ...).

1
mpontillo