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 -p
peut être utile pour ajouter seulement quelques modifications dans un fichier donné. Utilisezcommit -c ORIG_HEAD
si 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 stash
pour cacher la partie que vous n'avez pas commis (oustash --keep-index
avant vous pouvez même l'engager), Tester, puisgit stash pop
pour 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 --continue
pour 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 -a
comme 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).