J'ai fouillé mon histoire et je veux y apporter quelques changements. Le problème est que j'ai un commit avec deux changements non liés, et ce commit est entouré de quelques autres changements dans mon historique local (non poussé).
Je veux fractionner ce commit avant de le pousser, mais la plupart des guides que je vois ont à voir avec le fractionnement de votre commit le plus récent ou des modifications locales non validées. Est-il possible de faire cela à un commit qui est un peu enfoui dans l'histoire, sans avoir à "refaire" mes commits depuis?
Réponses:
Il existe un guide pour fractionner les validations dans la page de manuel de rebase . Le résumé rapide est:
Effectuez un rebase interactif incluant le commit cible (par exemple
git rebase -i <commit-to-split>^ branch
) et marquez-le comme étant à éditer.Lorsque le rebase atteint ce commit, utilisez
git reset HEAD^
pour réinitialiser avant le commit, mais gardez votre arbre de travail intact.Ajoutez et modifiez les modifications de manière incrémentielle, en effectuant autant de validations que vous le souhaitez.
add -p
peut être utile pour n'ajouter que certaines des modifications dans un fichier donné. Utilisationcommit -c ORIG_HEAD
si vous souhaitez réutiliser le message de validation d'origine pour une certaine validation.Si vous voulez tester ce que vous commettez (bonne idée!) Utilisez
git stash
pour cacher la partie que vous n'avez pas commise (oustash --keep-index
avant même de la commettre), testez, puisgit stash pop
remettez le reste dans l'arbre de travail. Continuez à faire des commits jusqu'à ce que toutes les modifications soient validées, c'est-à-dire que vous ayez un arbre de travail propre.Exécutez
git rebase --continue
pour continuer à appliquer les validations après la validation maintenant partagée.la source
git rebase -i <sha1_of_the_commit_to_split>^ branch
. Etgit gui
est un bel outil pour la tâche de fractionnement, qui peut être utilisé pour ajouter différentes parties d'un fichier dans différentes validations.git add -p
, qui peut faire plus que ce qui estgit gui
possible dans ce département (notamment éditer des mecs, tout mettre en scène à partir du morceau actuel et rechercher des mecs par expression régulière).Voici comment le faire avec Magit .
Dites que commit ed417ae est celui que vous voulez changer; il contient deux modifications indépendantes et est enfoui sous un ou plusieurs commits. Appuyez sur
ll
pour afficher le journal et accédez à ed417ae:r
Appuyez ensuite pour ouvrir la fenêtre de rebaseet
m
pour modifier le commit au point.Remarquez comment
@
il y a maintenant le commit que vous souhaitez diviser - cela signifie que HEAD est maintenant à ce commit:Nous voulons déplacer HEAD vers le parent, alors accédez au parent (47e18b3) et appuyez sur
x
(magit-reset-quickly
, lié ào
si vous utilisezevil-magit
) et entrez pour dire "oui je voulais dire valider au point". Votre journal devrait maintenant ressembler à:Maintenant, appuyez sur
q
pour passer à l'état normal de Magit, puis utilisez lau
commande régulière unstage pour annuler ce qui ne va pas dans le premier commit, validerc
le reste comme d'habitude, puiss
tage etc
ommit ce qui se passe dans le deuxième commit, et une fois terminé: appuyezr
pour ouvrir la fenêtre de rebaseet un autre
r
pour continuer, et vous avez terminé!ll
montre maintenant:la source
Pour diviser 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:Modifiez le commit avant
<commit>
NB: il faudra peut-être aussi le modifier
<commit>
aussi.Cerise
<commit>
dans l'indiceRéinitialiser interactivement les modifications inutiles de l'index et réinitialiser l'arborescence de travail
Comme alternative, cachez simplement les modifications inutiles de manière interactive:
git stash push -p -m "tmp other changes"
Apportez d'autres modifications (le cas échéant) et créez le nouveau commit
Facultativement, répétez les éléments 2 à 4 pour ajouter d'autres validations intermédiaires.
Continuer le rebasage
la source
Il existe une version plus rapide si vous souhaitez uniquement extraire le contenu d'un seul fichier. C'est plus rapide parce que le rebase interactif n'est plus réellement interactif (et c'est bien sûr encore plus rapide si vous voulez extraire du dernier commit, alors pas besoin du tout de rebaser)
the_file
. Fermezthe_file
. C'est la seule édition dont vous avez besoin, tout le reste n'est que des commandes git.Étape de cette suppression dans l'index:
Restaurez les lignes que vous venez de supprimer dans le fichier sans affecter l'index !
"SHA1" est le commit dont vous voulez extraire les lignes:
Créez le deuxième commit flambant neuf avec le contenu à extraire restauré à l'étape 3:
Ne modifiez pas, n'arrêtez / continuez pas - acceptez tout simplement:
Bien sûr, encore plus rapide lorsque le commit à extraire est le dernier commit:
Si vous utilisez
magit
alors les étapes 4, 5 et 6 sont une seule action: Valider, Fixup instantanéla source
Si vous n'avez pas encore poussé, utilisez simplement
git rebase
. Encore mieux, utilisezgit rebase -i
pour déplacer les validations de manière interactive. Vous pouvez déplacer le commit incriminé vers l'avant, puis le diviser à votre guise et reculer les patchs (si nécessaire).la source