723 votes

Comment ajouter un fichier modifié à un ancien (pas le dernier) commit dans Git

J'ai changé plusieurs choses au cours de la dernière heure et je les ai engagées étape par étape. Mais je viens de me rendre compte que j’avais oublié d’ajouter un fichier modifié, il y a quelques commits.

Le journal ressemble à ceci:

 GIT TidyUpRequests u:1 d:0> git log 
commit fc6734b6351f6c36a587dba6dbd9d5efa30c09ce 
Author: David Klein <> 
Date:   Tue Apr 27 09:43:55 2010 +0200

    The Main program now tests both Webservices at once

commit 8a2c6014c2b035e37aebd310a6393a1ecb39f463 
Author: David Klein <>
Date:   Tue Apr 27 09:43:27 2010 +0200

    ISBNDBQueryHandler now uses the XPath functions from XPath.fs too

commit 06a504e277fd98d97eed4dad22dfa5933d81451f 
Author: David Klein <> 
Date:   Tue Apr 27 09:30:34 2010 +0200

    AmazonQueryHandler now uses the XPath Helper functions defined in XPath.fs

commit a0865e28be35a3011d0b6091819ec32922dd2dd8 <--- changed file should go here
Author: David Klein <> 
Date:   Tue Apr 27 09:29:53 2010 +0200

    Factored out some common XPath Operations
 

Des idées? :)

1113voto

Greg Hewgill Points 356191

Utiliser git rebase. Plus précisément:

  1. Utiliser git rebase -i HEAD~10 (ou tout ce que vous avez besoin de voir assez loin).
  2. Marque le commit en question (a0865...) edit.
  3. Enregistrer le rebase fichier, et git retour à la coquille et attendre pour vous pour résoudre ce commit.
  4. Ajouter votre fichier avec git add.
  5. Modifier la commettre avec git commit --amend.
  6. Faire un git rebase --continue qui va réécrire le reste de votre commet à l'encontre de la nouvelle.

68voto

knittl Points 64110

avec git 1.7, il existe un moyen très simple d’utiliser git rebase :

mettre en scène vos fichiers:

 git add $files
 

créer un nouveau message de validation de validation et de réutilisation de votre validation "rompue"

 git commit -c master~4
 

ajouter fixup! dans la ligne d'objet (ou squash! si vous voulez éditer commit (message)):

 fixup! Factored out some common XPath Operations
 

utilisez git rebase -i --autosquash pour corriger votre commit

13voto

VonC Points 414372

Vous pouvez essayer un rebase --interactive session de modifier votre ancien commit (à condition que vous ne l'avez pas déjà pousser ceux qui s'engage à un autre repo).

Parfois, la chose fixe en b.2. ne peut pas être modifié pour le " pas tout à fait parfait commettre des correctifs, parce que la validation est enterré profondément dans un patch de la série.
C'est exactement ce que rebase interactif: à utiliser après beaucoup de "a"et "b"s, par la réorganisation et de l'édition s'engage, et en écrasant plusieurs s'engage dans une.

Démarrez avec le dernier commit que vous voulez à retenir est:

git rebase -i <after-this-commit>

Un éditeur sera tiré, avec tous les changements dans votre branche courante (en ignorant fusion s'engage), qui intervient après la validation donnée.
Vous pouvez réorganiser les commits dans cette liste le contenu de votre coeur, et vous pouvez les supprimer. La liste semble plus ou moins comme ceci:

pick deadbee The oneline of this commit
pick fa1afe1 The oneline of the next commit
...

Le oneline descriptions sont purement pour votre plaisir; git rebase ne sera pas regarder à eux, mais à la validation des noms ("deadbee" et "fa1afe1" dans cet exemple), afin de ne pas supprimer ou modifier les noms.

En remplaçant la commande "ramasser" avec la commande "edit", vous pouvez indiquer à git rebase pour arrêter après l'application qui s'engagent, de sorte que vous pouvez modifier les fichiers et/ou le message de commit modifier le commettre, et continuer de rebasage.

1voto

Jakub Narębski Points 87537

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X