Dans l'une de mes branches de développement, j'ai apporté quelques modifications à ma base de code. Avant de pouvoir terminer les fonctionnalités sur lesquelles je travaillais, j'ai dû passer de ma branche actuelle à master pour démo certaines fonctionnalités. Mais le simple fait d'utiliser un "git checkout master" a préservé les modifications que j'ai également apportées dans ma branche de développement, brisant ainsi certaines des fonctionnalités de master. Donc, ce que j'ai fait, c'est de valider les modifications sur ma branche de développement avec un message de validation "commit temporaire", puis de vérifier le maître pour la démo.
Maintenant que j'en ai terminé avec la démo et que je retourne travailler sur ma branche de développement, je voudrais supprimer le "commit temporaire" que j'ai fait tout en conservant les modifications que j'ai apportées. Est-ce possible?
git stash
git stash
soit un bon outil, les validations jetables "en cours" sont également un appareil tout à fait légitime.git stash
sur une autre branche dans l'intervalle.stash
est qu'il est complètement local et sera sujet à la perte de code due à la suppression ou à la recréation ou à la défaillance ou à la perte de matériel. OMI, il ne devrait vraiment être utilisé que pour les travaux en cours à très court terme. Aimez un engagement WIP avant de partir en vacances: P .. appelez cela un commit de vidage de cerveau!Réponses:
C'est aussi simple que ça:
Remarque: certains shells sont traités
^
comme un caractère spécial (par exemple, certains shells Windows ou ZSH avec globbing activé ), vous devrez donc peut-être citer"HEAD^"
dans ces cas.git reset
sans--hard
ou--soft
déplace votreHEAD
pour pointer vers le commit spécifié, sans modifier aucun fichier.HEAD^
fait référence au (premier) commit parent de votre commit actuel, qui dans votre cas est le commit avant le commit temporaire.Notez qu'une autre option consiste à continuer normalement, puis au prochain point de validation à la place, exécutez:
qui modifiera à la place le commit le plus récent, ayant le même effet que ci-dessus.
Notez que cela (comme avec presque toutes les réponses git) peut causer des problèmes si vous avez déjà poussé le mauvais commit vers un endroit où quelqu'un d'autre peut l'avoir retiré. Essayez d'éviter cela
la source
More?
après avoir fait ça. Tout ce que je tape à cette invite me donnefatal: ambiguous argument 'HEADwhateverItypedIn': unknown revision or path not in the working tree.
^
comme un caractère spécial. Vous pouvez soit citer la référence"HEAD^"
, soit utiliser la syntaxe alternativeHEAD~1
non citéegit reset HEAD\^
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
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.
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.
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-lepick
enfixup
ousquash
. L'utilisationfixup
supprime simplement le message et valide les modifications dans son prédécesseur immédiat dans la liste. Lesquash
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é.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 ...
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 ...
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.
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.
la source
git config --global alias.uncommit reset HEAD^
juste des alias non validés pour réinitialiser. Au lieu de cela, faitesgit config --global alias.uncommit 'reset HEAD^'
Je pense que tu cherches ça
git reset --soft HEAD~1
Il annule la validation la plus récente tout en conservant les modifications apportées à cette validation dans le transfert.
la source
git reset HEAD^
sous Windows demande simplement "Plus?" - quoi que cela signifie^
est un caractère d'échappement sous DOS. Lorsqu'il est associé à une nouvelle ligne, il sert d'invite de continuation pour la commande précédente. La saisiegit reset HEAD^^
devrait fonctionner sous Windows.Oui, vous pouvez supprimer votre commit sans supprimer les modifications: git reset @ ~
la source
git reset --soft
ougit reset --keep
?Vous recherchez soit
git reset HEAD^ --soft
ougit reset HEAD^ --mixed
.Il y a 3 modes à la commande de réinitialisation comme indiqué dans la documentation :
git reset HEAD^ --soft
annuler le
git commit
. Des modifications existent toujours dans l'arborescence de travail (le dossier du projet) + l'index (--cached)git reset HEAD^ --mixed
annuler
git commit
+git add
. Des modifications existent toujours dans l'arborescence de travailgit reset HEAD^ --hard
Comme si vous n'aviez jamais apporté ces modifications à la base de code. Les modifications ont disparu de l'arborescence de travail.
la source
Pour ceux qui utilisent zsh, vous devrez utiliser ce qui suit:
git reset --soft HEAD\^
Expliqué ici: https://github.com/robbyrussell/oh-my-zsh/issues/449
Dans le cas où l'URL devient morte, la partie importante est:
la source
git reset HEAD^
travaille dans zsh pour moi, peut avoir été corrigé.zsh 5.3 (x86_64-apple-darwin18.0)
Dans mon cas, j'ai déjà poussé au repo. Aie!
Vous pouvez annuler une validation spécifique tout en conservant les modifications dans vos fichiers locaux en procédant comme suit:
De cette façon, j'ai pu conserver les modifications dont j'avais besoin et annuler un commit déjà poussé.
la source
git revert bad-commit-sha
, alorsgit revert -n revert-commit-just-created-sha
, puis la réparation de là. Tu m'as à mi-chemin. Merci!L'utilisation de git 2.9 (précisément 2.9.2.windows.1) vous
git reset HEAD^
invite à en savoir plus; Je ne sais pas ce que l'on attend ici. Veuillez vous référer à la capture d'écran ci-dessousTrouvé une autre solution à l'
git reset HEAD~#numberOfCommits
aide de laquelle nous pouvons choisir de sélectionner le nombre de validations locales que vous souhaitez réinitialiser en gardant vos modifications intactes. Par conséquent, nous avons la possibilité de supprimer tous les commits locaux ainsi qu'un nombre limité de commits locaux.Reportez-vous ci-dessous des captures d'écran montrant
git reset HEAD~1
en action:la source
Une autre façon de le faire.
Ajoutez la validation au-dessus de la validation temporaire, puis procédez comme suit:
Pour fusionner deux commits en un (la commande ouvrira un fichier texte avec des instructions explicites, modifiez-le).
la source
git reset HEAD^
. Git rebase a beaucoup de place pour l'erreur ici.2020 Simple:
(Le hachage de validation du dernier commit que vous souhaitez conserver).
Si le commit a été poussé, vous pouvez alors faire:
Vous conserverez localement les modifications non validées
la source