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?

282
demandé sur APerson 2010-11-29 22:06:12

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é. Utilisez commit -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 (ou stash --keep-index avant vous pouvez même l'engager), Tester, puis git 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.

434
répondu Cascabel 2017-05-23 11:47:22

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:

  1. Modifier le commettre avant <commit>

    git rebase -i <commit>^^
    

    NB: peut-être faudra-t-il aussi éditer <commit> .

  2. écrémer <commit> dans l'index

    git cherry-pick -n <commit>
    
  3. 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"

  4. 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.

  5. Continuer rebasage

    git rebase --continue
    
0
répondu ruvim 2018-10-03 12:11:52

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).

-1
répondu Gintautas Miliauskas 2010-11-29 19:11:36