Comment puis-je diviser un git commit enterré dans l'histoire?
-
29-09-2019 - |
Question
Je flubbed mon histoire et que vous voulez faire quelques changements. Le problème est, j'ai un commettras avec deux changements non liés, et ce commit est entouré par d'autres changements dans mon histoire locale (non poussé).
Je veux partager cette avant de commettre le pousse, mais la plupart des guides que je vois ont à voir avec Éclatement les plus récents commettre, ou les changements locaux non engagés. Est-il possible de le faire à un commit qui est enterré dans l'histoire un peu, sans avoir à « re-faire » mon commits depuis?
La solution
Il y a un guide commits de division dans le rebasage manpage. Le résumé est rapide:
-
Effectuer un rebasage interactif incluant la cible engager (par exemple
git rebase -i <commit-to-split>^ branch
) et le marquer à éditer. -
Quand le cours de rebasage qui engagent, utilisez
git reset HEAD^
pour rétablir avant que la livraison, mais gardez votre arbre de travail intact. -
incrémentalement ajouter les changements et les engage, en faisant autant de commits comme vous le souhaitez.
add -p
peut être utile d'ajouter que certaines des modifications dans un fichier donné. Utilisezcommit -c ORIG_HEAD
si vous voulez réutiliser le message de commit original pour un certain commettre. -
Si vous voulez tester ce que vous vous engagez (bonne idée!) L'utilisation
git stash
pour cacher la partie que vous avez commis (oustash --keep-index
avant de vous engager même le), test,git stash pop
alors retourner repos à l'arbre de travail. Continuez à faire commits jusqu'à ce que vous obtenez toutes les modifications commises, à savoir un arbre de travail propre. -
Exécuter
git rebase --continue
procéder application des commits après la validation maintenant divisée.
Autres conseils
Voici comment le faire avec Magit .
Dites commit ed417ae est celui que vous voulez changer; il contient deux changements non reliés et est enterré sous un ou plusieurs commits. Hit ll
pour afficher le journal et accédez à ed417ae:
puis appuyez sur r
pour ouvrir le menu contextuel de rebasage
et m
pour modifier le commit au point.
Remarquez comment l'@
il est maintenant sur la commettras vous voulez diviser - cela signifie HEAD est maintenant à ce commettras:
Nous voulons déplacer la tête de la mère, donc naviguer à et entrez-à-dire le parent (47e18b3) et x
hit (si vous utilisez magit-reset-quickly
o
, lié à evil-magit
) « oui je voulais dire commettre au point ». Votre journal devrait ressembler à:
Maintenant, appuyez sur q
pour accéder au statut de Magit régulière, puis utilisez la commande désindexer de u
régulière pour désindexer ce qui ne va pas dans le premier engagement, engager c
le reste comme d'habitude, puis s
tage et c
ommit ce qui se passe dans la seconde engager, et lorsque vous avez terminé: succès r
pour ouvrir le menu contextuel de rebasage
et un autre r
de continuer, et vous avez terminé! ll
affiche maintenant:
Pour diviser un commettras <commit>
et ajoutez le nouveau commit avant celui-ci , et enregistrer la date auteur de <commit>
, - les étapes suivantes:
-
Modifier commit avant
<commit>
git rebase -i <commit>^^
NB:. Peut-être il sera également nécessaire pour modifier
<commit>
et -
Cherry choisir
<commit>
dans l'indexgit cherry-pick -n <commit>
-
reset interactivement changements inutiles de l'index et réinitialiser l'arbre de travail
git reset -p && git checkout-index -f -a
Comme solution de rechange, juste stash changements non nécessaires de manière interactive:
git stash push -p -m "tmp other changes"
-
Faire d'autres modifications (le cas échéant) et créer le nouveau commit
git commit -m "upd something" .
En option, répétez les articles 2-4 à ajouter commits intermédiaires.
-
Continuer rebasage
git rebase --continue
Si vous ne l'avez pas encore poussé, il suffit d'utiliser git rebase
. Mieux encore, l'utilisation git rebase -i
de se déplacer de manière interactive autour engage. Vous pouvez déplacer l'infraction engage à l'avant, puis le diviser comme vous aimez et déplacer les patches arrière (si nécessaire).