120 votes

Supprimer les anciens commits git

Je suis très novice en matière de git, et je me demandais si quelque chose comme cela était possible ?

>git log --pretty=oneline --abbrev-commit
2f05aba Added new feature
3371cec Fixed screw up    <-- I want to remove this
daed25c Screw up          <-- and remove this.
e2b2a84 First.                So it's like they never happend.

Est-ce possible ?

109voto

Shathur Points 267

Si vous souhaitez vraiment les supprimer (les effacer de l'historique, pour ne plus jamais les voir), vous pouvez

exécuter rebase :

git rebase -i HEAD~4

et ensuite, supprimez (ou commentez) les lignes correspondant aux commits que vous souhaitez supprimer, comme suit :

pick 2f05aba ... #will be preserved
#pick 3371cec ... #will be deleted
#pick daed25c ... #will be deleted
pick e2b2a84 ... #will be preserved

2 votes

Je suis nouveau sur github, comment pousser les changements après cela (quand je clique sur Sync, cela revient à ce que j'ai fait). Je crois que j'ai compris : git push origin HEAD --force

0 votes

@NicolasThery vous ne le faites pas. C'est pourquoi git push refuse de fonctionner sans --force, parce qu'on réécrit l'histoire et qu'on casse les dépôts des autres. Si vous avez déjà poussé, votre seule option est de faire un git revert . Ce qui, quand on y pense, est raisonnable car si vous tirez le code de quelqu'un d'autre, vous ne voudriez pas qu'il soit capable d'effacer vos anciens commits sans une sorte d'historique, n'est-ce pas ?

0 votes

Je suppose que cela fonctionne simplement dans le repo Git actuel et ne modifie rien en amont/aucun autre nœud Git ?

75voto

Deve Points 1792

Ceci est possible avec git rebase . Essayez ce qui suit

git rebase -i HEAD~4

puis suivez les instructions interactives de votre éditeur. Dans la première étape, vous "écrasez" les commits. Cela devrait ressembler à ceci :

pick 2f05aba ... will be preserved
squash 3371cec ... will be squashed with daed25c
squash daed25c ... will be squashed with e2b2a84
pick e2b2a84 .. will contain this and 3371cec and daed25c

Dans la deuxième étape, vous pouvez modifier les messages de validation.

41 votes

La question n'est-elle pas de supprimer les commits plutôt que de les écraser ?

4 votes

@Stony : Eh bien, vous pourriez probablement aussi les supprimer. Mais d'après les commentaires de l'OP ("Screw up" et "Fixed screw up"), j'ai supposé que l'un défaisait l'autre et que vous pouviez tout aussi bien écraser les deux.

0 votes

@Richard use drop dans l'éditeur

19voto

russoue Points 113

Une nouvelle option permet de supprimer complètement un ou plusieurs engagements. drop pour les rebases interactives git. Première exécution :

git rebase -i HEAD~4

Remplacer ensuite pick con drop pour que le(s) commit(s) soit(ent) abandonné(s) :

pick 2f05aba ... #will be preserved
drop 3371cec ... #will be dropped
drop daed25c ... #will be dropped
pick e2b2a84 ... #will be preserved

Cela a fonctionné pour moi sur Fedora avec la version suivante :

$ git version
git version 2.21.0

4voto

LoungeKatt Points 692

Squash est utile lorsque vous souhaitez générer une liste de commits fusionnés sous un seul hash, mais si vous souhaitez prendre trois commits distincts et obtenir un résultat final qui ressemble à un seul commit, je recommande fixup

git rebase -i HEAD~4

pick 2f05aba ... will be preserved
fixup 3371cec ... will be merged with daed25c
fixup daed25c ... will be merged with e2b2a84
pick e2b2a84 .. will include 3371cec and daed25c, but only the commit message of e2b2a84

Vous trouverez plus d'informations dans la liste des commandes de l'interface interactive de rebase.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X