web-dev-qa-db-fra.com

Comment changer un engagement passé pour inclure un fichier manquant?

J'ai commis une modification et j'ai oublié d'ajouter un fichier à l'ensemble de modifications. Après d'autres commits, j'ai réalisé que le fichier manquait maintenant d'un HEAD^4 commit.

Comment réécrire un commit précédent pour inclure le fichier manquant?

93
kolrie

Utilisation git rebase --interactive HEAD~4 et définissez l'option edit pour le commit que vous souhaitez modifier.

Rappelez-vous que vous ne devez pas modifier les commits envoyés au référentiel distant de cette façon. Il est préférable d'ajouter un nouveau commit avec un fichier manquant dans ce cas.

54
Rafał Rawicki

Je me rends compte que les gens peuvent google et venir ici pour trouver une réponse plus simple: Et si c'était seulement le dernier commit? (La question de OP est de réparer le 4ème commit dans l'historique)

Dans le cas où vous vous engagez et réalisez que vous avez oublié d'ajouter un fichier immédiatement, faites simplement:

# edited file-that-i-remember.txt
git add file-that-i-remember.txt
git commit

# realize you forgot a file
git add file-that-i-forgot.txt
git commit --amend --no-edit

--no-edit gardera le même message de validation.

Peasy facile!

266
Dr Beco

Si vous n'avez PAS poussé ces 4 commits, vous pouvez le faire comme suit:

Créez des fichiers de correctifs pour tous ces commits:

git format-patch -4

Rembobiner de 4 commits:

git reset --hard HEAD~4

Ajouter le fichier manquant:

git add missing-file

Engagez-le avec --amend:

git commit --amend

Appliquez tous les correctifs sauvegardés:

git am *.patch

Si vous avez poussé, vous ne devriez pas utiliser cette méthode. Au lieu de cela, admettez simplement votre erreur et créez un autre commit en plus de HEAD qui corrige ce problème.

10
mvp

Bien que la réponse acceptée soit correcte, il manque des instructions détaillées sur la manière de modifier un commit au cours d'un processus de rebase.

  • Commencez par lancer un processus de rebase:

    git rebase --interactive HEAD~4
    
  • Une liste de commits sera présentée, choisissez un commit que vous souhaitez éditer en changeant le mot pick en edit et enregistrez le fichier.

  • Apportez les modifications nécessaires dans votre code (n'oubliez pas d'appeler git add pour les nouveaux fichiers)

  • Une fois toutes les modifications terminées, lancez git commit --amend - cela modifiera un commit marqué comme edit

  • Invoquer git rebase --continue qui terminera le processus (s'il y a plus de commits marqués comme edit, les étapes ci-dessus doivent être répétées)

Notes importantes:

  • NE supprimez PAS les lignes marquées comme pick que vous ne souhaitez pas modifier - laissez-les telles quelles. La suppression de ces lignes entraînera la suppression des commits associés

  • GIT vous oblige à stash avant de changer de base si votre répertoire de travail n’est pas propre; vous pouvez cependant git stash pop / git stash apply pendant la refonte, afin de modifier ces changements (c.-à-d. modifications stockées avant de démarrer le processus de refonte) en un commit marqué comme edit

  • si quelque chose ne va pas et que vous voulez annuler les modifications apportées pendant le processus de rebase avant la fin (c.-à-d. vous voulez revenir au point avant de commencer la rebase), utilisez git rebase --abort - lisez aussi: Comment abandonner une base interactive si --aort ne fonctionne pas?

  • Comme indiqué dans la réponse acceptée:

    N'oubliez pas que vous ne devez pas modifier les validations envoyées au référentiel distant de cette manière. Il est préférable d'ajouter un nouveau commit avec un fichier manquant dans ce cas.

    La réponse pourquoi, se trouve dans le Git Book (paragraphe intitulé " Les dangers de la modification de la base"):

    Ne réabaissez pas les commits qui existent en dehors de votre référentiel.

    Si vous suivez cette directive, tout ira bien. Si vous ne le faites pas, les gens vont vous haïr et vous serez méprisé par vos amis et votre famille.

    Lorsque vous modifiez le contenu, vous abandonnez les commits existants et créez-en de nouveaux similaires mais différents. Si vous envoyez des commits quelque part et que d'autres les abaissent et fondent leur travail sur eux, puis vous réécrivez ces commits avec git rebase et relancez-les de nouveau, vos collaborateurs devront alors fusionner leur travail et les choses deviendront désordonnées lorsque vous essaierez. ramène leur travail dans le tien.

    [...]

6
dominik