Sur un dépôt local, je viens de l'exécuter git cherry-pick SHA
sans aucun conflit ni problème. J'ai alors réalisé que je ne voulais pas faire ce que je venais de faire. Je n'ai poussé cela nulle part.
Comment puis-je supprimer uniquement cette sélection de cerises?
J'aimerais savoir s'il existe un moyen de le faire:
- quand j'ai d'autres changements locaux
- quand je n'ai pas d'autres changements locaux
De préférence avec une seule commande pour les deux cas si possible.
Pour annuler votre dernier commit, faites simplement
git reset --hard HEAD~
.Edit : cette réponse s'appliquait à une version antérieure de la question qui ne mentionnait pas la préservation des changements locaux; la réponse acceptée de Tim est en effet la bonne. Merci à qwertzguy pour l'avertissement.
la source
HEAD
) est plus robuste: considérez le cas malheureux oùhead
est le nom d'une référence existante.Si possible, évitez les réinitialisations matérielles. Les réinitialisations matérielles sont l'une des très rares opérations destructives de git. Heureusement, vous pouvez annuler une sélection de cerises sans réinitialisation et éviter tout ce qui est destructeur.
Notez le hachage du cherry-pick que vous souhaitez annuler, dites-le
${bad_cherrypick}
. Faites ungit revert ${bad_cherrypick}
. Maintenant, le contenu de votre arbre de travail est comme avant votre mauvaise sélection.Répétez votre
git cherry-pick ${wanted_commit}
, et lorsque vous êtes satisfait de la nouvelle sélection de cerises, faites ungit rebase -i ${bad_cherrypick}~1
. Pendant le rebase, supprimez les deux${bad_cherrypick}
et son retour correspondant.La branche sur laquelle vous travaillez n'aura que le bon choix. Aucune réinitialisation nécessaire!
la source
git reflog
peut venir à votre secours.Tapez-le dans votre console et vous obtiendrez une liste de votre historique git avec SHA-1 qui les représente.
Vérifiez simplement tout SHA-1 auquel vous souhaitez revenir
Avant de répondre, ajoutons un peu de contexte, expliquant ce que c'est
HEAD
.First of all what is HEAD?
HEAD
est simplement une référence au commit actuel (le plus récent) sur la branche courante.Il ne peut y en avoir qu'un seul
HEAD
à la fois. (excluantgit worktree
)Le contenu de
HEAD
est stocké à l'intérieur.git/HEAD
et contient les 40 octets SHA-1 du commit actuel.detached HEAD
Si vous n'êtes pas sur le dernier commit, c'est-à-dire qu'il
HEAD
pointe vers un commit précédent dans l'historique, il est appelédetached HEAD
.Sur la ligne de commande, cela ressemblera à ceci: SHA-1 au lieu du nom de la branche car le
HEAD
ne pointe pas vers la pointe de la branche actuelleQuelques options pour récupérer à partir d'un HEAD détaché:
git checkout
Cela va extraire une nouvelle branche pointant vers le commit souhaité.
Cette commande récupérera un commit donné.
À ce stade, vous pouvez créer une branche et commencer à travailler à partir de ce point.
git reflog
Vous pouvez également utiliser le
reflog
.git reflog
affichera tout changement qui a mis à jour leHEAD
et la vérification de l'entrée de reflog désirée rétabliraHEAD
cette validation.Chaque fois que le HEAD est modifié, il y aura une nouvelle entrée dans le
reflog
Cela vous ramènera à votre engagement souhaité
git reset --hard <commit_id>
"Déplacez" votre HEAD vers le commit souhaité.
vous pouvez également utiliser le
git rebase --no-autostash
.git revert <sha-1>
"Annuler" la plage de validation ou de validation donnée.
La commande de réinitialisation "annulera" toutes les modifications apportées au commit donné.
Un nouveau commit avec le correctif d'annulation sera validé tandis que le commit original restera également dans l'historique.
Ce schéma illustre quelle commande fait quoi.
Comme vous pouvez le voir,
reset && checkout
modifiez le fichierHEAD
.la source
git reset --hard
Face à ce même problème, j'ai découvert que si vous vous êtes engagé et / ou poussé à distance depuis votre choix de cerise réussi, et que vous souhaitez le supprimer, vous pouvez trouver le SHA du choix de cerise en exécutant:
git log --graph --decorate --oneline
Ensuite, (après avoir utilisé
:wq
pour quitter le journal), vous pouvez supprimer le cherry-pick en utilisantgit rebase -p --onto YOUR_SHA_HERE^ YOUR_SHA_HERE
où
YOUR_SHA_HERE
est égal au SHA de 40 ou 7 caractères abrégé du commit sélectionné.Au début, vous ne pourrez pas appliquer vos modifications car votre dépôt distant et votre dépôt local auront des historiques de validation différents. Vous pouvez forcer vos commits locaux à remplacer ce qui se trouve sur votre télécommande en utilisant
git push --force origin YOUR_REPO_NAME
(J'ai adapté cette solution de Seth Robertson : voir «Suppression d'un commit entier».)
la source
Une commande et n'utilise pas la
git reset
commande destructive :GIT_SEQUENCE_EDITOR="sed -i 's/pick/d/'" git rebase -i HEAD~ --autostash
Il supprime simplement le commit, vous remettant exactement dans l'état avant le choix de la cerise, même si vous aviez des modifications locales.
la source
git reset HEAD^
?git reset
l'action de validation sans abandonner aucune des modifications. Je vous recommande de lire git-scm.com/docs/git-reset . La question de OP est d'annuler un choix de cerise. Essayez les deux commandes, la mienne vous remettra dans l'état exact où vous étiez avant la sélection.git reset
gâchera votre arbre de travail car il laisse les changements choisis par la cerise sur le gâteau et ils deviennent indiscernables de vos changements locaux préexistants.reset --hard
. Il ne laisse aucun changementgit reset --hard
est une commande destructive qui supprimera également les modifications locales non liées et le fera de manière irrécupérable! Ce n'est donc pas ce que le PO a demandé.sed
fait cette commande, en quoi cela diffère du fait de le faire manuellement et ce que--autostash
fait.