Git: supprimer le fichier validé après l'envoi


105

Existe-t-il une possibilité de restaurer un fichier validé dans Git? J'ai poussé un commit sur GitHub, puis j'ai réalisé qu'il y avait un fichier que je ne voulais pas pousser (je n'ai pas terminé les modifications).


Voulez-vous supprimer complètement le fichier de GitHub après un push? Sinon, vous n'avez qu'à: git rm <file>, git push.
rdrmntn


Réponses:


144

mise à jour: méthode plus sûre ajoutée

méthode préférée:

  1. vérifier l'état précédent (inchangé) de votre fichier; remarquez le double tiret

    git checkout HEAD^ -- /path/to/file
    
  2. le commettre:

    git commit -am "revert changes on this file, not finished with it yet"
    
  3. poussez-le, aucune force nécessaire:

    git push
    
  4. revenez à votre travail inachevé, recommencez (flèche vers le haut 3 fois):

    git checkout HEAD^ -- /path/to/file
    

effectivement `` sans engagement '':

Pour modifier le dernier commit du référentiel HEAD, obscurcir votre travail poussé accidentellement, tout en pouvant potentiellement entrer en conflit avec votre collègue qui l'a peut-être déjà tiré, et qui poussera les cheveux gris et perdra beaucoup de temps à essayer de réconcilier son chef de branche locale avec le central:

Pour supprimer le changement de fichier du dernier commit:

  1. pour rétablir le fichier à l'état avant le dernier commit, faites:

    git checkout HEAD^ /path/to/file
    
  2. pour mettre à jour le dernier commit avec le fichier rétabli, faites:

    git commit --amend
    
  3. pour pousser le commit mis à jour vers le référentiel, faites:

    git push -f
    

Vraiment, pensez à utiliser la méthode préférée mentionnée précédemment.


1
À moins que vous ne soyez le seul développeur d'un projet, vous ne devriez vraiment pas utiliser git push -f. Cela crée beaucoup plus de problèmes que cela ne vaut la peine. Supprimez simplement le fichier puis effectuez un nouveau commit.
richardm

1
@ user553086 ne pouvait pas être plus d'accord. Mieux maintenant?
xor

Est-ce faisable avec des commits plus anciens dans l'histoire? Par exemple, pourrais-je faire cela avec git checkout HEAD~2 /path/to/file? Edit: On dirait que ce que je voulais dans mon cas était simplementgit rm /path/to/file
starscream_disco_party

1
Tu viens de me sauver 4 heures mon frère!
Tosin Onikute

52

Si vous souhaitez supprimer le fichier du référentiel distant, supprimez-le d'abord de votre projet avec l'option --cache, puis poussez-le:

git rm --cache /path/to/file
git commit -am "Remove file"
git push

(Cela fonctionne même si le fichier a été ajouté au dépôt distant il y a quelques validations) N'oubliez pas d'ajouter à .gitignore les extensions de fichier que vous ne voulez pas pousser.


2
Cela supprime les fichiers de ce commit, mais les fichiers sont toujours visibles dans les anciens commits.
Ken

29

Vous ne pouvez rétablir qu'un seul fichier à une révision spécifiée.

Vous pouvez d'abord vérifier sur quels commits le fichier a été modifié.

git log path/to/file.txt

Ensuite, vous pouvez extraire le fichier avec le numéro de révision.

git checkout 3cdc61015724f9965575ba954c8cd4232c8b42e4 /path/to/file.txt

Après cela, vous pouvez vous engager et le pousser à nouveau.


7

Réinitialisez le fichier dans un état correct, validez et appuyez à nouveau.

Si vous êtes sûr que personne d'autre n'a encore récupéré vos modifications, vous pouvez utiliser --amendlors de la validation, pour modifier votre précédent commit (c'est-à-dire réécrire l'historique), puis pousser. Je pense que vous devrez utiliser l' -foption lors de la poussée, pour forcer la poussée, cependant.


3
  1. Obtenez le code de hachage du dernier commit.

    • git log
  2. Annuler le commit
    • git revert <hash_code_from_git_log>
  3. Poussez les changements
    • git push

vérifier dans le GHR. vous pourriez obtenir ce dont vous avez besoin, j'espère que cela vous sera utile

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.