Ma configuration Git est telle que je travaille dans une branche "fonctionnalité" locale et que je valide les modifications dans cette branche au fur et à mesure que je travaille. Lorsque le code est prêt, je fusionne dans ma branche locale "develop". Je pousse ensuite les modifications de ma branche locale "develop" vers la branche distante "develop".
J'ai apporté quelques modifications à un fichier et je les ai validées sans me rendre compte que j'étais sur ma branche locale "develop" plutôt que sur ma branche "feature". J'ai réalisé mon erreur avant de pousser la branche "develop" vers la branche distante "develop", donc les changements restent locaux.
Comment annuler ce commit dans ma branche "develop" locale? J'utilise Tortoise Git mais je peux toujours utiliser la ligne de commande Git si nécessaire.
Remarque: ce n'est pas ma première validation dans la branche de fonctionnalité ou ma première fusion dans la branche de développement.
3 Réponses :
Il existe plusieurs façons de résoudre le problème. Une façon serait de sélectionner le commit sur votre branche feature . Ensuite, réinitialisez votre branche develop au commit précédent.
fonctionnalité git checkout git cherry-pick git checkout develop git reset --hard HEAD ~ 1
Notez que 1. et 2. ne sont nécessaires que si vous avez une branche feature existante qui a déjà des commits.
Alors, parlons de la façon de déplacer ces commits vers la branche de fonctionnalité, puis de les annuler. Pour les besoins de cette explication, nous supposerons que seuls les commits errants sont allés dans votre branche develop localement.
Obtenez les hachages de commit pour chacun des commits errants sur develop . Vous pouvez le faire dans votre interface graphique, ou vérifier develop et exécuter git log dans un terminal. Copiez-collez-les quelque part où vous pourrez les référencer ultérieurement.
Vérifiez votre branche feature . Vous allez maintenant exécuter un git cherry-pick pour chacun des hachages de validation que vous avez enregistrés à l'étape 1. Vous voulez faire cela dans l'ordre dans lequel ils ont été validés dans la branche develop . Cela rejoue chacun de ces commits sur votre branche locale feature .
Effectuez une réinitialisation matérielle sur votre branche develop pour la ramener à la version distante. En supposant que la référence distante est origin / develop , vous feriez git reset --hard origin / develop
Notez qu'il existe d'autres moyens de le faire, en utilisant git rebase ou en utilisant des rebases interactifs. C'est juste le moyen le plus simple auquel je pourrais penser pour le transmettre à quelqu'un qui a une expérience git inconnue.
Notez que si vous craignez de pouvoir revenir en arrière au cas où les choses ne se passeraient pas comme prévu, vous pouvez utiliser git tag pour créer des balises de secours.
S'il y a plusieurs "commits errants", vous pouvez utiliser git rebase au lieu de plusieurs git cherry-pick s.
Oui, certainement - il y a des moyens plus rapides et plus intelligents, bien sûr - la sélection des cerises est plus manuelle, mais j'ai pensé que c'était une approche "plus sûre" au cas où ce serait un débutant relatif.
Notez que mon commentaire s'adresse davantage au PO et aux futurs visiteurs qu'à vous en tant que répondeur. Je suppose que puisque vous répondez aux questions dans git , il y a de fortes chances que vous soyez familiarisé avec le rebase.
Si vous avez oublié de créer une branche pour votre fonctionnalité, vous devez en créer une:
git checkout develop
Ensuite, vous pouvez réinitialiser develop pour revenir là où il devrait être:
git checkout feature git cherry-pick develop
Si vous avez déjà une branche feature où vous voulez déplacer le commit que vous avez fait accidentellement sur develop , alors vous pouvez utiliser git cherry-pick :
git reset --hard HEAD~
Ensuite, vous pouvez réinitialiser develop comme ci-dessus. Assurez-vous simplement de vérifier d'abord:
git branch feature
Est-ce le dernier commit de "develop", ou avez-vous fait d'autres commits pour "develop" depuis?
@melpomene - C'était le dernier commit de la branche locale de développement
Double possible de Supprimer les commits d'une branche dans Git
git reset --hard HEAD ~ 1supprimera le dernier commit dans votre branche (et toutes les modifications locales que vous avez pu faire). Utiliser avec précaution.git rebase -ipeut être utilisé pour supprimer les commits du milieu de votre historique. Utiliser avec précaution.