Il existe deux façons de gérer cela. Ce qui est plus facile dépend de votre situation
Réinitialiser
Si le commit dont vous souhaitez vous débarrasser était le dernier commit, et que vous n'avez effectué aucun travail supplémentaire, vous pouvez simplement utiliser git-reset
git reset HEAD^
Ramène votre branche au commit juste avant votre HEAD actuel. Cependant, cela ne change pas réellement les fichiers dans votre arborescence de travail. En conséquence, les changements qui étaient dans ce commit apparaissent comme modifiés - c'est comme une commande «non validée». En fait, j'ai un alias pour ça.
git config --global alias.uncommit 'reset HEAD^'
Ensuite, vous pouvez simplement utiliser git uncommit
à l'avenir pour sauvegarder un commit.
Écrasement
Écraser un commit signifie combiner deux ou plusieurs commits en un seul. Je le fais assez souvent. Dans votre cas, une fonctionnalité à moitié terminée est validée, puis vous la terminez et la validez à nouveau avec le message de validation approprié et permanent.
git rebase -i <ref>
Je dis ci-dessus parce que je tiens à préciser que cela pourrait être un nombre illimité de retours. Exécutez git log
et trouvez le commit dont vous voulez vous débarrasser, copiez son SHA1 et utilisez-le à la place <ref>
. Git vous fera passer en mode rebase interactif. Il montrera tous les commits entre votre état actuel et tout ce que vous mettez en place <ref>
. Donc, s'il <ref>
y a 10 commits, il vous montrera les 10 commits.
Devant chaque commit, il aura le mot pick
. Trouvez le commit dont vous voulez vous débarrasser et changez-le pick
en fixup
ou squash
. L'utilisation fixup
supprime simplement le message et valide les modifications dans son prédécesseur immédiat dans la liste. Le squash
mot-clé fait la même chose, mais vous permet de modifier le message de validation du commit nouvellement combiné.
Notez que les validations seront réengagées dans l'ordre dans lequel elles apparaissent dans la liste lorsque vous quittez l'éditeur. Donc, si vous avez effectué une validation temporaire, puis effectué d'autres travaux sur la même branche et terminé la fonctionnalité dans une validation ultérieure, l'utilisation de rebase vous permettrait de trier à nouveau les validations et de les écraser.
ATTENTION:
Le remodelage modifie l'historique - NE FAITES PAS cela sur les commits que vous avez déjà partagés avec d'autres développeurs.
Stashing
À l'avenir, pour éviter ce problème, envisagez d'utiliser git stash
pour stocker temporairement le travail non engagé.
git stash save 'some message'
Cela stockera vos modifications actuelles sur le côté dans votre liste de dissimulation. Ci-dessus est la version la plus explicite de la commande stash, permettant un commentaire pour décrire ce que vous cachez. Vous pouvez également simplement exécuter git stash
et rien d'autre, mais aucun message ne sera stocké.
Vous pouvez parcourir votre liste de dissimulations avec ...
git stash list
Cela vous montrera toutes vos cachettes, sur quelles branches elles ont été faites, et le message et au début de chaque ligne, et l'identifiant de cette cachette qui ressemble à ceci stash@{#}
où # est sa position dans le tableau des cachettes.
Pour restaurer une cachette (ce qui peut être fait sur n'importe quelle branche, peu importe où la cachette a été créée à l'origine), vous exécutez simplement ...
git stash apply stash@{#}
Encore une fois, il y a la position dans le tableau des stashes. Si la cachette que vous souhaitez restaurer est en 0
position - c'est-à-dire, si c'était la cachette la plus récente. Ensuite , vous pouvez simplement exécuter la commande sans spécifier la position de Stash, git suppose que vous voulez dire que le dernier: git stash apply
.
Ainsi, par exemple, si je me retrouve à travailler sur la mauvaise branche - je peux exécuter la séquence de commandes suivante.
git stash
git checkout <correct_branch>
git stash apply
Dans votre cas, vous avez déplacé un peu plus les branches, mais la même idée s'applique toujours.
J'espère que cela t'aides.
git stash