Comment puis-je diviser un git commit enterré dans l'histoire?
j'ai rampé mon histoire et je veux y apporter quelques changements. Le problème est que j'ai un commit avec deux changements sans rapport, et ce commit est entouré par d'autres changements dans mon histoire locale (non poussé).
je veux diviser ce commit avant de le faire sortir, mais la plupart des guides que je vois ont à voir avec la division de votre dernier commit, ou des changements locaux non engagés. Est-il possible de faire cela à un commit un peu enfoui dans l'histoire, sans devoir "refaire" mes commisages depuis lors?
3 réponses
Il existe un guide pour le fractionnement s'engage dans le rebase man . Le résumé rapide est:
-
effectuer un rebase interactif incluant le commit cible (e.g.
git rebase -i <commit-to-split>^ branch) et le marquer pour être édité. -
lorsque le rebase atteint ce commit, utilisez
git reset HEAD^pour réinitialiser avant le commit, mais gardez votre arbre de travail intact. -
ajouter progressivement les modifications et les engager, en faisant autant de commits que désiré.
add -ppeut être utile pour ajouter seulement quelques modifications dans un fichier donné. Utilisezcommit -c ORIG_HEADsi vous souhaitez réutiliser le message de propagation original pour une propagation déterminée. -
si vous voulez tester ce que vous commettez (bonne idée!)
git stashpour cacher la partie que vous n'avez pas commis (oustash --keep-indexavant vous pouvez même l'engager), Tester, puisgit stash poppour retourner le reste à l'arbre de travail. Continuez à faire des propagations jusqu'à ce que vous obteniez toutes les modifications engagées, c'est-à-dire que vous ayez un arbre de travail propre. -
Exécuter
git rebase --continuepour procéder à l'application de la commet, après la scission de la validation.
pour séparer un commit <commit> et ajouter le nouveau commit avant celui-ci , et enregistrer la date de l'auteur de <commit> , - les étapes sont les suivantes:
-
Modifier le commettre avant
<commit>git rebase -i <commit>^^NB: peut-être faudra-t-il aussi éditer
<commit>. -
écrémer
<commit>dans l'indexgit cherry-pick -n <commit> -
réinitialiser de façon interactive les changements non nécessaires de l'indice et réinitialiser l'arbre de travail
git reset -p && git checkout-index -f -acomme alternative, il suffit de stocker les changements non nécessaires de manière interactive:
git stash push -p -m "tmp other changes" -
apporter d'autres modifications (le cas échéant) et créer la nouvelle commit
git commit -m "upd something" .optionnellement, répéter les articles 2-4 pour ajouter plus d'intermédiaire engager.
-
Continuer rebasage
git rebase --continue
si vous n'avez pas encore poussé, utilisez git rebase . Mieux encore, utilisez git rebase -i pour déplacer les propagations de façon interactive. Vous pouvez déplacer le commit offensif vers l'avant, puis le diviser comme vous le souhaitez et déplacer les patches en arrière (si nécessaire).