2
votes

Git - Comment annuler un commit dans une mauvaise branche locale?

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.

git

4 commentaires

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 ~ 1 supprimera le dernier commit dans votre branche (et toutes les modifications locales que vous avez pu faire). Utiliser avec précaution. git rebase -i peut être utilisé pour supprimer les commits du milieu de votre historique. Utiliser avec précaution.


3 Réponses :


4
votes

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.

  1. fonctionnalité git checkout
  2. git cherry-pick
  3. git checkout develop
  4. git reset --hard HEAD ~ 1

1 commentaires

Notez que 1. et 2. ne sont nécessaires que si vous avez une branche feature existante qui a déjà des commits.



0
votes

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.

  1. 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.

  2. 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 .

  3. 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.


3 commentaires

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.



1
votes

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


0 commentaires