Comment modifier les commits passés pour inclure un fichier manqué?

j'ai commis un changement et j'ai oublié d'ajouter 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 une propagation précédente pour inclure le fichier manquant?

86
demandé sur Jacek Laskowski 2013-01-17 02:34:19

4 réponses

utilisez git rebase --interactive HEAD~4 et définissez edit pour l'option de propagation que vous souhaitez modifier.

rappelez-vous que vous ne devrait pas modifier les propagations poussées vers le dépôt distant de cette façon. Il est préférable d'ajouter une nouvelle propagation avec fichier manquant dans ce cas.

51
répondu Rafał Rawicki 2013-01-16 22:43:06

je réalise que les gens peuvent google et venir ici pour trouver une réponse plus simple: et si ce n'était que le dernier commit? (OP question est pour la fixation de la 4e commettre en arrière dans l'histoire)

dans le cas où vous commettez et réalisez que vous avez oublié d'ajouter un fichier immédiatement , faites juste:

# 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 conservera le même message de propagation.

easy peasy!

257
répondu Dr Beco 2018-07-07 02:48:36

si vous N'avez pas poussé ces 4 commits, vous pouvez le faire comme suit:

créer des fichiers correctifs pour toutes ces propagations:

git format-patch -4

revenir en arrière par 4 s'engage:

git reset --hard HEAD~4

Ajouter fichier manquant:

git add missing-file

validez avec --amend :

git commit --amend

appliquer tous les correctifs sauvegardés retour:

git am *.patch

si vous ont poussé, vous ne devriez PAS utiliser cette méthode. Au lieu de cela, il suffit d'admettre votre erreur et de créer un commit de plus sur le dessus de la tête qui corrige ce problème.

9
répondu mvp 2013-01-16 22:44:45

bien que la réponse acceptée soit correcte, il n'y a pas d'instructions détaillées sur la façon d'éditer une propagation pendant un processus de rebase.

  • tout d'abord, démarrer 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 remplaçant le mot pick par edit et sauvegardez le fichier.

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

  • après que toutes les modifications ont été faites, émettre git commit --amend - ceci modifiera une propagation marquée 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 pick que vous ne voulez pas éditer - laissez-les telles quelles. La suppression de ces lignes entraînera la suppression des commits

  • "
  • Git vous oblige à stash avant de rebaser si votre répertoire de travail n'est pas propre; vous pouvez cependant git stash pop / git stash apply pendant rebase, afin de modifier ces changements (c.-à-d. changements cachés avant le début du processus de rebase) à une propagation marquée comme edit

  • si quelque chose s'est mal passé et que vous voulez revenir sur les changements effectués pendant le processus de rebase avant qu'il ne soit terminé (c'est - à-dire que vous voulez revenir au point avant de commencer le rebase), utilisez git rebase --abort - lisez aussi: Comment annuler un rebase interactif si --l'annulation ne fonctionne pas?

  • comme dit dans la réponse acceptée:

    N'oubliez pas que vous ne devez pas modifier les propagations poussées vers le dépôt distant de cette façon. Il est préférable d'ajouter une nouvelle propagation avec fichier manquant dans ce cas.

    La réponse pourquoi, est dans le Git Livre (paragraphe intitulé Les Dangers de la Relocalisation "):

    Ne pas rebase s'engage à ce que existent en dehors de votre référentiel.

    si vous suivez cette ligne directrice, tout ira bien. Si tu ne le fais pas, les gens te détesteront, et tu seras méprisé par les amis et la famille.

    quand on rebase des trucs, on abandonne les commits existants et on en crée de nouveaux qui sont similaires mais différents. Si vous poussez les commits quelque part et d'autres les tirent vers le bas et travaillent sur eux de base, et puis vous réécrivez ces commits avec git rebase et les poussez vers le haut à nouveau, votre les collaborateurs devront fusionner à nouveau leur travail et les choses vont devenir confuses quand vous essayez de tirer leur travail dans le vôtre.

    [...]

2
répondu dominik 2018-09-18 19:20:37