Supprimer les fichiers de Git commit

J'utilise git et j'ai créé des fichiers en utilisant

 git commit -a 

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

Comment supprimer un fichier du dernier commit?

849
18 сент. Mojoy est fixé au 18 septembre 2012-09-18 19:59 '12 à 19h59 2012-09-18 19:59
@ 19 réponses

Je pense que les autres réponses ici sont incorrectes, car il s’agit de déplacer les fichiers fixés de manière erronée vers la zone intermédiaire de la fixation précédente sans annuler les modifications apportées. Cela peut être fait comme suggéré par Paritosh Singh:

 git reset --soft HEAD^ 

ou

 git reset --soft HEAD~1 

Puis réinitialisez les fichiers indésirables pour les exclure du commit:

 git reset HEAD path/to/unwanted_file 

Maintenant, essayez à nouveau, vous pouvez réutiliser le même message de validation:

 git commit -c ORIG_HEAD 
1673
10 марта '13 в 13:56 2013-03-10 13:56 la réponse est donnée juzzlin 10 mars 13 à 13:56 2013-03-10 13:56

Attention ! Si vous voulez supprimer un fichier de votre commit précédent et le sauvegarder sur le disque, lisez la réponse de juzzlin un peu plus haut.

S'il s'agit de votre dernière validation et que vous souhaitez supprimer complètement le fichier de votre référentiel local et distant , vous pouvez:

  • supprimer le fichier git rm <file>
  • commit avec change flag: git commit --amend
border=0

L'indicateur de correctif indique à git de corriger à nouveau, mais de "fusionner" (pas dans le sens de fusionner deux branches), corrigez-le avec le dernier correctif.

Et pour le dire comme vous, la commande rm de git fait ce que rm elle-même!

168
18 сент. réponse donnée par CharlesB le 18 septembre 2012-09-18 20:22 '12 à 20h22 2012-09-18 20:22

Les réponses existantes suggèrent de supprimer les derniers fichiers indésirables.

Si vous souhaitez supprimer les fichiers inutiles de l' ancien commit (même en cas de pression) et que vous ne voulez pas créer de nouveau commit, ce qui est facultatif en raison de l'action suivante:

1

Trouvez le commit que vous voulez que le fichier corresponde.

 git checkout <commit_id> <path_to_file> 

Vous pouvez le faire plusieurs fois si vous souhaitez supprimer beaucoup de fichiers.

2

 git commit -am "remove unwanted files" 

3

Recherchez le commit_id commit par lequel les fichiers ont été ajoutés à tort , par exemple, "35c23c2" ici

 git rebase 35c23c2~1 -i // notice: "~1" is necessary 

Cette commande ouvre l'éditeur en fonction de vos paramètres. La valeur par défaut est vim.

Déplacez le dernier commit, qui devrait être "supprimer les fichiers inutiles", vers la ligne suivante du commit incorrect ("35c23c2" dans notre cas) et définissez la commande comme fixup :

 pick 35c23c2 the first commit fixup 0d78b28 remove unwanted files 

Après avoir sauvegardé le fichier, ça devrait aller.

Pour finir:

 git push -f 

Si, malheureusement, vous obtenez des conflits, vous devez les résoudre manuellement.

75
27 янв. Répondu par Brian le 27 janvier 2015-01-27 18:24 '15 à 18:24 2015-01-27 18:24

Supprimer un fichier avec rm le supprimera!

Vous ajoutez toujours un commit à git au lieu de le supprimer, vous devez donc rétablir le fichier dans l'état dans lequel il se trouvait avant la première validation (il peut s'agir de l'action delete "rm" si le fichier est nouveau), puis re-commit et le fichier sera .

Pour ramener un fichier à son état précédent:

  git checkout <commit_id> <path_to_file> 

ou le retourner à l'état sur la tête HEAD distante:

  git checkout origin/master <path_to_file> 

puis changez le commit et vous devriez trouver que le fichier a disparu de la liste (et n'est pas supprimé de votre disque!)

30
28 янв. Bob Flannigon a posté une réponse le 28 janvier 2013-01-28 17:00 '13 à 17h00 2013-01-28 17:00

Si vous n'avez pas cliqué sur les modifications sur le serveur, vous pouvez utiliser

 git reset --soft HEAD~1 

Il réinitialisera toutes les modifications et reviendra à un commit.

Si vous avez cliqué sur vos modifications, suivez les étapes ci-dessous, comme indiqué dans @CharlesB.

28
18 сент. La réponse est donnée par Paritosh Singh, 18 sep . 2012-09-18 21:28 '12 à 21:28 2012-09-18 21:28
 git checkout HEAD~ path/to/file git commit --amend 
27
23 авг. Réponse donnée par Denis Shchepetov le 23 août. 2013-08-23 22:01 13 à 22h01: 2013-08-23 22:01

Comme le montre la réponse acceptée, vous pouvez le faire en supprimant le commit complet. Mais c'est une approche plutôt difficile.
Une façon plus simple de le faire est d’enregistrer le commit et de supprimer simplement les fichiers modifiés.

 git reset HEAD^ -- path/to/file git commit --amend --no-edit 

git reset prendra le fichier de la même manière que dans la validation précédente et le générera dans l'index. Le fichier dans le répertoire de travail n'est pas touché.
Ensuite, git commit corrige et insère l'index dans le commit en cours.

Il accepte essentiellement la version du fichier qui était dans la validation précédente et l'ajoute à la validation actuelle. Cela ne change pas le réseau, le fichier est donc effectivement supprimé du commit.

25
25 февр. Réponse donnée par Patrick le 25 février 2017-02-25 03:06 '17 à 3:06 2017-02-25 03:06

Ce qui suit désactivera uniquement le fichier que vous vouliez, ce qui est requis par l'OP.

 git reset HEAD^ /path/to/file 

Vous verrez quelque chose comme ce qui suit ...

Changements que vous devez faire: (utilisez "git reset HEAD ..." pour désinstaller)

modifié: / chemin / vers / fichier

Les modifications ne sont pas apportées à commit: (utilisez "git add ..." pour mettre à jour ce qui sera fait) (utilisez "git checkout -..." pour ignorer les modifications dans le répertoire de travail)

modifié: / chemin / vers / fichier

  • "Modifications que vous devez effectuer" est une version précédente du fichier avant la validation. Cela ressemblera à une suppression si le fichier n'a jamais existé. Si vous apportez cette modification, une révision apparaîtra qui renverra la modification au fichier de votre branche.
  • "Les modifications ne sont pas livrées pour la validation" correspond à la modification apportée et à l'état actuel du fichier.

À ce stade, vous pouvez faire ce que vous voulez dans le fichier, par exemple, réinitialiser une autre version.

Lorsque vous êtes prêt à vous engager:

 git commit --amend -a 

ou (si vous ne souhaitez pas apporter d'autres modifications)

 git commit add /path/to/file git commit --amend 
24
07 дек. la réponse est donnée ThatsAMorais 07 déc. 2014-12-07 10:13 14 à 10:13 2014-12-07 10:13

Si vous souhaitez enregistrer la validation (vous avez peut-être déjà passé un certain temps à créer un message détaillé sur la validation et que vous ne voulez pas le perdre) et que vous souhaitez supprimer le fichier uniquement de la validation, mais pas complètement du référentiel.

 git checkout origin/<remote-branch> <filename> git commit --amend 
8
17 июня '13 в 23:07 2013-06-17 23:07 la réponse est donnée mattexx 17 juin '13 à 23:07 2013-06-17 23:07
 git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file> git commit -m "removed unwanted file from git" 

vous laissera un fichier local. Si vous ne souhaitez pas non plus que le fichier soit local, vous pouvez ignorer l'option --cached.

Si tout le travail est dans votre branche locale, vous devez enregistrer le fichier dans un commit ultérieur et, comme pour avoir un historique vierge, je pense qu'un moyen plus simple de le faire pourrait être:

 git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file> git commit --squash <commit_id> git add <file_to_remove_from_commit_<commit_id>_which_added_file> git commit -m "brand new file!" git rebase --interactive <commit_id>^ 

et vous pouvez facilement terminer le redémarrage sans avoir à mémoriser des commandes plus complexes, ni corriger un message, ni entrer le même numéro.

6
23 февр. La réponse est donnée par Bryan Buckley le 23 février. 2016-02-23 09:22 '16 à 09:22 am 2016-02-23 09:22

L’utilisation de l’interface graphique de git peut faciliter la suppression d’un fichier d’une validation précédente.

En supposant qu'il ne s'agisse pas d'une branche partagée et que la réécriture de l'histoire ne vous dérange pas, exécutez:

 git gui citool --amend 

Vous pouvez annuler le fichier qui a été corrigé par erreur, puis cliquer sur "Valider".

2019

6
18 мая '15 в 22:50 2015-05-18 22:50 La réponse est donnée par JDiMatteo le 18 mai 2015 à 22h50 . 2015-05-18 22:50

Exécutez une séquence des commandes suivantes:

 //to remove the last commit, but preserve changes git reset --soft HEAD~1 //to remove unneded file from the staging area git reset HEAD `<your file>` //finally make a new commit git commit -m 'Your message' 
5
10 сент. la réponse est donnée par Sergey Onishchenko 10 sep . 2015-09-10 14:51 '15 à 14h51 2015-09-10 14h51

Je vais vous expliquer un exemple: Soit A, B, C trois fixations consécutives. Valider B contient un fichier qui n'aurait pas dû être validé.

  • $ git log # take A commmit_id
  • $ git rebase -i "A_ID"
  • changement de commit en 'e' dans vim rebase
  • $ git rm unwanted_file
  • $ git rebase continue
  • $ git push -force
3
17 авг. réponse donnée par Moaz Rashad le 17 août 2017-08-17 12:52 '17 à 12:52 2017-08-17 12:52

Je voulais juste ajouter la première réponse, car je devais exécuter une commande supplémentaire:

 git reset --soft HEAD^ git checkout origin/master <filepath> 

Hourra!

3
25 мая '16 в 18:24 2016-05-25 18:24 la réponse est donnée par andrepo le 25 mai 2016 à 18:24 2016-05-25 18:24

Quelque chose qui a fonctionné pour moi, mais je pense toujours qu'il devrait y avoir une meilleure solution:

 $ git revert <commit_id> $ git reset HEAD~1 --hard 

Laissez simplement le changement que vous voulez annuler dans un autre commit, vérifiez les autres.

 $ git commit --amend // or stash and rebase to <commit_id> to amend changes 
2
14 авг. réponse donnée par saiyancoder 14 août. 2014-08-14 08:34 14 à 08h34: 2014-08-14 08:34

En fait, je pense que le moyen le plus rapide et le plus simple consiste à utiliser le mode interactif git.

 git rebase -i head~1 

(ou la tête ~ 4, jusqu'où vous voulez aller)

puis utilisez 'edit' au lieu de 'pick'. Je n'ai pas compris à quel point le montage est puissant.

https://www.youtube.com/watch?v=2dQosJaLN18

J'espère que vous l'apprécierez.

1
19 мая '16 в 23:58 2016-05-19 23:58 la réponse est donnée par Matt le 19 mai 2016 à 23:58 2016-05-19 23:58

Avait le même problème quand j'ai des modifications dans la branche locale, où je voulais renvoyer un seul fichier. Ce qui a fonctionné pour moi -

( feature / target_branch ) où j'ai toutes mes modifications, y compris celles que je voulais annuler pour un fichier spécifique)

( origin / feature / target_branch ) est la branche distante à laquelle je souhaite apporter des modifications)

(la fonction / étape est ma branche intermédiaire temporaire dans laquelle je construirai toutes les modifications souhaitées, à l'exclusion de la modification de ce fichier)

  • Créer une branche locale à partir de mon origine / fonctionnalité / target_branch - appelée une fonction / instruction

  • Fusion de ma branche locale / cible_branch avec une branche

  • La fonction / instruction est vérifiée, puis git reset --soft ORIG_HEAD (maintenant, toutes les modifications de la fonction / étape "seront organisées, mais pas corrigées.)

  • Fichier désinstallé que j'ai précédemment vérifié avec des modifications inutiles

  • Modification de la branche en amont pour function / origin / feature / target_branch

  • Refaites les modifications progressives restantes et cliqué en amont sur ma source / fonction / target_branch distante

1
23 янв. la réponse est donnée par l' utilisateur1201303 le 23 janvier . 2017-01-23 07:13 '17 à 7:13 2017-01-23 07:13

Si vous n'avez pas encore appuyé sur la validation, GitHub Desktop résout facilement ce problème:

  • Sélectionnez le référentiel → Annuler le dernier commit.
  • Désélectionnez le fichier que vous avez ajouté par erreur. Votre message de validation précédent sera déjà dans la boîte de dialogue.
  • Appuyez sur le bouton de maintien!
1
14 марта '17 в 22:41 2017-03-14 22:41 la réponse est donnée par Ron le 14 mars 17 à 22:41 2017-03-14 22:41

Si vous n'avez plus besoin de ce fichier, vous pouvez créer

 git rm file git commit --amend git push origin branch 
0
29 сент. la réponse est donnée le 29 sep . 2017-09-29 00:49 '17 à 0:49 2017-09-29 00:49

Autres questions sur tags ou Poser une question