Déplacer des files entre des commits

J'ai deux commits consécutifs, quelque part dans l'histoire locale, et un file a été ajouté par erreur dans le second. Je veux réparer la situation.

Je ne comprends pas comment devrais-je utiliser le rebase interactif. J'ai fait git rebase -i HEAD~10 et choisi d'éditer le commit avec le file afin de le vérifier à partir de là. J'utilise git guit mais, ne vois pas de files dans la zone de validation. Je peux choisir de modifier le commit précédent puis je vois les files. Mais, je ne peux pas append le file mal placé à ce commit précédent car je ne vois pas le file dans le commit actuel pour commencer.

Solutions Collecting From Web of "Déplacer des files entre des commits"

Si je ne me trompe pas, ce que vous voulez, c'est déplacer une modification qui a été incluse dans commit 2 pour commettre 1.

Je trouve que la façon la plus simple de le faire est de faire deux rebas interactifs consécutifs.

Dans la première, vous divisez commit 2 en deux commits: le premier incluant uniquement le changement que vous voulez déplacer, et le second incluant tout le rest. Nous avons maintenant 1, 2.1 et 2.2.

Ensuite, vous rebasculez à nouveau, et cette fois choisissez de réduire la validation 2.1 en 1.

Ainsi, lors du rebasage, choisissez d'éditer à la fois le commit où vous avez ajouté le file par erreur, et celui que vous voulez append dans cet ordre. Si le file est dans un commit ultérieur, mais devrait être dans un précédent, vous devrez réordonner les lignes. Par exemple, je commence par

 pick 8de731b Commit with missing file. pick bbef925 Commit with too many files. pick 52490ce More history. 

Je dois le changer pour

 edit bbef925 Commit with too many files. edit 8de731b Commit with missing file. pick 52490ce More history. 

Alors,

 # In the commit containing an extra file git reset HEAD^ badfile.c git commit --amend git rebase --continue # Now in the commit to add it to git add badfile.c git commit --amend git rebase --continue 

Malheureusement, lors de la modification de l'historique dans une twig, je ne connais aucun moyen d'éviter l'édition de l'historique dans toutes les twigs. Rebasing devrait être fait le plus tôt possible pour éviter des problèmes comme celui-ci. Dans mon cas simple ici, je peux merge master et l'autre twig, mais les commits ne fusionnent pas, alors je dois rebaser en master, et réorganiser et écraser les commits, comme ceci:

 pick 7cd915f Commit with missing file. fixup 8de731b Commit with missing file. #This was the higher of the two ensortinges pick 8b92c5a Commit with too many files. fixup bbef925 Commit with too many files. #This was the higher of the two ensortinges pick 94c3f7f More history. fixup 52490ce More history. #This was the higher of the two ensortinges 

Modification en retard: Je viens de remarquer que je réorganisais accidentellement l'historique de commit en tant que report de ma réponse originale. L'échange des lignes dans le rebasage modifie l'ordre que vous avez validé; après l'édition, vous pouvez à nouveau rebaser et les échanger pour revenir à l'ordre de validation d'origine.

Comme je trébuche souvent sur cette question, j'ai écrit un script pour cela. Cela fonctionne entièrement automatiquement. Vous pouvez le find sur Github . Copiez-le dans le système de files local, ajoutez-le à PATH et vous pourrez l'exécuter comme:

 mv-changes <source-commit> <destination-commit> <path>... 

Vous pouvez également exécuter le script dans le shell Git-Bash sous Windows.

Notez que s'il y a des changements de <path> dans les commits intermédiaires entre source-commit et destination-commit , cela ne fonctionnera pas.

Plus de détails sont fournis ici .