Comment changer l’engagement passé pour inclure un fichier manqué?

J’ai commis un changement et j’ai oublié d’append un fichier à l’ensemble de modifications. Après d’autres commits, j’ai réalisé que le fichier est maintenant absent d’un commit HEAD^4 .

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

Utilisez git rebase --interactive HEAD~4 et définissez l’option de edit de la validation à modifier.

N’oubliez pas que vous ne devez pas modifier les validations envoyées au référentiel distant de cette façon. Il est préférable d’append un nouveau commit avec le fichier manquant dans ce cas.

Je me rends compte que les gens peuvent google et viennent ici pour trouver une réponse plus simple: Et si c’était juste le dernier engagement? (La question de l’OP est de réparer le 4ème engagement dans l’histoire)

Dans le cas où vous vous engagez et réalisez que vous avez oublié d’append un fichier immédiatement , procédez comme suit:

 # 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!

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

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

 git format-patch -4 

Rembobinez par 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 patchs sauvegardés:

 git am *.patch 

Si vous avez appuyé, vous ne devez PAS utiliser cette méthode. Au lieu de cela, admettez simplement votre erreur et créez un autre engagement sur HEAD, qui corrige ce problème.

Bien que la réponse acceptée soit correcte, elle ne contient pas d’instructions détaillées sur la manière de modifier une validation au cours d’un processus de rebase.

  • Commencez par lancer un processus de rebase:

     git rebase --interactive HEAD~4 
  • Une liste de validations sera présentée, choisissez un commit que vous souhaitez modifier en modifiant le pick mots pour edit et enregistrer le fichier.

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

  • Une fois toutes les modifications effectuées, git commit --ammend – cela modifiera un commit marqué comme edit

  • Appelez git rebase --continue terminer le processus (s’il y a d’autres commits marqués comme edit , les étapes ci-dessus doivent être répétées)

Notes IMPORTANTES:

  • NE PAS supprimer 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 validations associées

  • GIT vous oblige à vous stash avant de rebaser si votre répertoire de travail n’est pas propre, mais vous pouvez toujours git stash pop / git stash apply pendant le rebase afin de modifier ces modifications (changements cachés avant de lancer le processus)

  • Si quelque chose s’est mal passé et que vous voulez annuler les modifications apscopes pendant le processus de rebase avant que celui-ci ne soit terminé, utilisez git rebase --abort – comme suit: Comment abandonner une rebase interactive si –bort ne fonctionne pas?

  • Comme dit 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 façon. Il est préférable d’append un nouveau commit avec le fichier manquant dans ce cas.

    La réponse est dans le Git Book (paragraphe intitulé ” The Perils of Rebasing “):

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

    Si vous suivez cette directive, vous irez bien. Si vous ne le faites pas, les gens vous détesteront et vous serez méprisés par vos amis et votre famille.

    Lorsque vous rebassez des éléments, vous abandonnez les commits existants et en créez de nouveaux similaires mais différents. Si vous poussez des commits quelque part et que d’autres les réduisent et que vous les travaillez, puis que vous réécrivez ces validations avec git rebase et que vous les relancez, vos collaborateurs vont devoir recomposer leur travail et les choses se gâteront ramenez leur travail dans le vôtre.

    […]