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?
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.
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
où --no-edit
conservera le même message de propagation.
easy peasy!
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.
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
paredit
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 commeedit
"
-
invoquer
git rebase --continue
qui terminera le processus (s'il y a plus de commits marqués commeedit
, 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 cependantgit 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 commeedit
-
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.
[...]