2288 votes

Supprimer les fichiers d'un commit Git

J'utilise Git et j'ai validé quelques fichiers en utilisant la méthode suivante

git commit -a

Plus tard, j'ai découvert qu'un fichier avait été ajouté par erreur au commit.

Comment puis-je supprimer un fichier du dernier commit ?

3 votes

Ce lien répond parfaitement à votre question : stackoverflow.com/questions/307828/

0 votes

@CharlesB : oui, c'est mon dernier commit.

10 votes

Avez-vous poussé le commit vers le serveur ?

4213voto

juzzlin Points 3839

Je pense que les autres réponses sont erronées, car il s'agit de déplacer les fichiers commis par erreur vers la zone de transit à partir du commit précédent, sans annuler les changements effectués sur ces fichiers. Cela peut être fait comme Paritosh Singh l'a suggéré :

git reset --soft HEAD^ 

ou

git reset --soft HEAD~1

Ensuite, réinitialisez les fichiers indésirables afin de les exclure de la validation :

git reset HEAD path/to/unwanted_file

Maintenant, faites un nouveau commit, vous pouvez même réutiliser le même message de commit :

git commit -c ORIG_HEAD

125 votes

Merci pour cela. Il est intéressant d'ajouter que si vous avez déjà poussé votre commit précédent (erroné), et que vous essayez maintenant de git push votre correctif à votre dépôt, il se plaindra Updates were rejected because the tip of your current branch is behind its remote counterpart. . Si vous êtes sûr de vouloir les pousser (par exemple, si c'est votre fourchette), vous pouvez utiliser la fonction -f pour forcer la poussée, par ex. git push origin master -f . (Ne faites pas cela sur un dépôt amont dont d'autres personnes se servent).

64 votes

git reset --soft HEAD^ est mon opération d'annulation la plus courante

0 votes

Cela devrait être la réponse acceptée, et pourquoi n'est-elle pas plus haute sur la page ?

440voto

CharlesB Points 27070

ATTENTION ! Si vous voulez seulement supprimer un fichier de votre précédent commit, et que gardez-le sur le disque , lire La réponse de juzzlin juste au-dessus.

Si c'est votre dernière livraison et que vous voulez supprimer complètement le fichier de votre référentiel local et du référentiel distant vous pouvez :

  1. supprimer le fichier git rm <file>
  2. commettre avec le drapeau amender : git commit --amend

Le drapeau amend indique à git de commiter à nouveau, mais de "fusionner" (pas dans le sens de fusionner deux branches) ce commit avec le dernier commit.

Comme indiqué dans les commentaires, l'utilisation de git rm ici, c'est comme utiliser le rm la commande elle-même !

172 votes

Vous pouvez également utiliser git rm --cached pour conserver les fichiers sur le disque

21 votes

Avertissement à ceux qui parcourent cette réponse : assurez-vous que vous voulez SUPPRIMER le fichier (comme dans gone gone gone !), et pas seulement le supprimer de la liste Commit.

12 votes

Pour compléter ce que disent les autres (et pour qu'il soit plus facile de se rappeler de ne pas le faire, sauf si vous le voulez vraiment) : Le site rm dans le git commande est faire ce qui rm lui-même le fait !

65voto

Paritosh Singh Points 2112

Si vous n'avez pas poussé les changements sur le serveur vous pouvez utiliser

git reset --soft HEAD~1

Cela réinitialisera tous les changements et reviendra à un commit précédent.

Si vous avez poussé vos modifications, suivez les étapes indiquées par @CharlesB.

2 votes

-1 git reset supprime les modifications apportées au fichier de la zone de transit, ici la modification a été validée.

0 votes

OK, mais je vais garder mon downvote puisque ce n'est pas ce que le PO veut :) désolé

0 votes

Ok c'est bien pour moi, mais pourquoi l'adversaire ne veut pas de ça. Quel est le problème ?

49voto

Bob Flannigon Points 553

La suppression du fichier à l'aide de rm le supprimera !

Dans git, vous ajoutez toujours à un commit plutôt que de le supprimer, donc dans ce cas, remettez le fichier dans l'état dans lequel il était avant le premier commit (cela peut être une action de suppression 'rm' si le fichier est nouveau) et ensuite re-commit et le fichier disparaîtra.

Pour remettre le fichier dans un état antérieur :

    git checkout <commit_id> <path_to_file>

ou pour le remettre dans l'état où il se trouvait à l'HEAD distant :

    git checkout origin/master <path_to_file>

puis modifiez le commit et vous devriez constater que le fichier a disparu de la liste (et non pas supprimé de votre disque !).

48voto

git checkout HEAD~ path/to/file
git commit --amend

1 votes

C'est la meilleure façon de modifier le dernier commit, celui qui n'a pas été poussé. Cela va réinitialiser les changements dans un fichier, en supprimant effectivement ce fichier du dernier commit.

2 votes

Cela a également modifié le fichier. Comment préserver les modifications locales dans le fichier ?

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