Question Puis-je supprimer un commit git mais garder les changements


Dans l'une de mes branches de développement, j'ai apporté quelques modifications à mon code. Avant de pouvoir compléter les fonctionnalités sur lesquelles je travaillais, je devais changer ma branche actuelle en master pour démo certaines fonctionnalités. Mais le simple fait d'utiliser un "git checkout master" a permis de conserver les modifications que j'avais également faites dans ma branche de développement, brisant ainsi certaines fonctionnalités de master. Donc ce que j'ai fait était de valider les changements sur ma branche de développement avec un message de commit "commit temporaire", puis un checkout master pour la démo.

Maintenant que j'ai fini 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 apportées. Est-ce possible?


516
2018-04-02 18:56


origine


Réponses:


C'est aussi simple que ça:

git reset HEAD^

git reset sans un --hard ou --soft déplace votre HEAD pour pointer vers la validation spécifiée, sans modifier les fichiers. HEAD^ fait référence au (premier) parent commit de votre commit actuel, qui dans votre cas est le commit avant le commit temporaire.

Notez qu'une autre option consiste à continuer comme d'habitude, puis au point de validation suivant, exécutez:

git commit --amend [-m … etc]

qui va plutôt modifier le commit le plus récent, ayant le même effet que ci-dessus.

Notez que cela (comme avec presque toutes les réponses de git) peut causer des problèmes si vous avez déjà poussé le mauvais engagement vers un endroit où quelqu'un d'autre l'a peut-être retiré. Essayez d'éviter cela


856
2018-04-02 18:58



Il y a deux façons de gérer cela. Le plus facile dépend de votre situation

Réinitialiser

Si le commit dont vous voulez vous débarrasser est 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 à la validation juste avant votre HEAD actuel. Cependant, il ne modifie pas réellement les fichiers de votre arbre de travail. Par conséquent, les modifications qui étaient dans ce commit apparaissent comme modifiées - c'est comme une commande 'non-active'. En fait, j'ai un pseudonyme à faire.

git config --global alias.uncommit 'reset HEAD^'

Ensuite, vous pouvez juste utilisé 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, vous avez une fonctionnalité à moitié validée, puis vous la terminez et vous recommencez avec le bon message de validation permanent.

git rebase -i <ref>

Je dis ci-dessus parce que je veux préciser que cela pourrait être un nombre de commits de retour. Courir git log et trouvez le commit dont vous voulez vous débarrasser, copiez son SHA1 et utilisez-le à la place de <ref>. Git vous emmènera en mode de rebasage interactif. Il montrera tous les engagements entre votre état actuel et tout ce que vous mettez à la place de <ref>. Donc si <ref> il ya 10 commits, il vous montrera tous les 10 commits.

Devant chaque engagement, il aura le mot pick. Trouvez le commit dont vous voulez vous débarrasser et changez-le pick à fixup ou squash. En utilisant fixup rejette simplement le message et fusionne les modifications dans son prédécesseur immédiat dans la liste. le squash Le 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éactivées dans l'ordre dans lequel elles apparaissent dans la liste lorsque vous quittez l'éditeur. Ainsi, si vous avez effectué une validation temporaire, puis que d'autres travaux ont été effectués sur la même branche et que vous avez terminé la fonctionnalité dans un commit ultérieur, l'utilisation de rebase vous permet de trier les validations et de les écraser.

ATTENTION:

Le rebasing modifie l'historique - NE FAITES PAS cela pour les validations que vous avez déjà partagées avec d'autres développeurs.

Cacher

A l'avenir, pour éviter ce problème, pensez à 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 aussi simplement courir git stash et rien d'autre, mais aucun message ne sera stocké.

Vous pouvez parcourir votre liste de dissimulation avec ...

git stash list

Cela vous montrera toutes vos cachettes, les branches sur lesquelles elles ont été faites, et le message et au début de chaque ligne, et l'identifiant pour 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, quel que soit l'endroit où la cachette a été créée à l'origine), vous exécutez simplement ...

git stash apply stash@{#}

Encore une fois, # est la position dans le tableau des cachettes. Si la mémoire que vous voulez restaurer est dans le 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 stockage, git supposera que vous voulez dire 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é les branches un peu plus, mais la même idée s’applique toujours.

J'espère que cela t'aides.


98
2018-04-03 03:55



Oui, vous pouvez supprimer votre validation sans supprimer les modifications:     git reset @ ~


16
2017-08-23 18:44



Je pense que vous cherchez ceci

git reset --soft TETE ~ 1

cela vous amènera au commit précédent et gardera les changements que vous avez faits.


13
2018-03-09 09:57



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:

git revert -n <sha>

De cette façon, j'ai pu garder les changements dont j'avais besoin et annuler un commit qui avait déjà été poussé.


4
2018-05-18 14:20



En utilisant git 2.9 (précisément 2.9.2.windows.1) git reset HEAD^ invite pour plus; pas sûr de ce qui est attendu ici. S'il vous plaît se référer ci-dessous capture d'écran

enter image description here

Trouvé une autre solution git reset HEAD~#numberOfCommits en utilisant ce que nous pouvons choisir pour sélectionner le nombre de commits locaux que vous voulez réinitialiser en gardant vos changements intacts. Par conséquent, nous avons l'occasion de jeter tous les commits locaux ainsi que le nombre limité de commits locaux.

Reportez-vous ci-dessous screenshots montrant git reset HEAD~1 en action: enter image description here

enter image description here


3
2017-11-22 10:03



Une autre façon de le faire.

Ajoutez commit en haut de la validation temporaire, puis faites:

git rebase -i

Pour fusionner deux validations en une seule (la commande ouvrira le fichier texte avec des instructions explicites, éditez-le).


2
2018-04-02 19:59