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).

kmaci
la source
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.

xor
la source
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.

micoru
la source
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.

René Höhle
la source
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.

JB Nizet
la source
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

krish babu
la source