Comment puis-je squash deux non consécutifs s'engage?
Je suis un peu nouveau pour l'ensemble de l'année de référence dans git. Disons que j'ai fait la suite s'engage à:
A -> B -> C -> D
Par la suite, je me rends compte que D
contient un correctif qui dépend d'un nouveau code ajouté dans A
, et que ces révisions vont de pair. Comment puis-je squash A
& D
ensemble et laisser B
& C
seul?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez exécuter
git rebase --interactive
et réorganiser D avant B et les courges D en A.Git va ouvrir un éditeur, et vous voyez un fichier comme ceci:
Maintenant vous modifiez le fichier qu'il ressemble à ceci:
Et git maintenant fusionner les modifications de A et D, ainsi que dans un commit, et de mettre B et C par la suite. Lorsque vous ne souhaitez pas conserver le message de validation de D, vous pouvez également utiliser la fonction "correction" mot-clé.
There is no tracking information for the current branch
erreur lors de l'année de référence. Dans ce cas, vous devez spécifier le nombre de commits que vous voulez travailler avec, comme ceci:git rebase -i HEAD~4
. Voir cette réponse.Remarque: Vous devez pas changer les commits qui ont été poussés à un autre repo en quelque sorte sauf si vous connaissez la les conséquences.
git log --oneline -4
git rebase --interactive
Type
i
(Mis VIM en mode insertion)Modifier la liste ressemble à ceci (Vous n'avez pas à supprimer ou d'inclure le message de commit). Ne pas écorcher
squash
!:Type Esc alors
ZZ
(Enregistrer et quitter VIM)Type
i
Modifier le texte de ce que vous voulez que le nouveau message de commit ressembler. Je recommande ce être une description des changements en commettre
A
etD
:Type Esc alors
ZZ
git log --oneline -4
git show E
Vous avez maintenant créé un nouveau commit
E
. S'engageA
etD
n'êtes plus dans votre histoire, mais qui ne sont pas partis. Vous pouvez toujours les récupérer à ce moment et pour un temps pargit rebase --hard D
(git rebase --hard
va détruire tous les changements locaux!).Pour ceux qui utilisent SourceTree:
Assurez-vous que vous ne l'avez pas déjà poussé la commet.
Squash with previous
Rebase interactif fonctionne bien jusqu'à ce que vous avez de grandes branche avec 20-30 s'engage et/ou d'un couple de fusions de maître ou/et de la fixation des conflits alors que vous, a été la validation de votre branche. Même avec la conclusion de ma s'engage à travers l'histoire et le remplacement de
pick
avecsquash
n'a pas travaillé ici. Alors que je cherchais une autre façon et a trouvé ce l'article.J'ai fait mes modifications à ce travail sur la branche distincte:
Avant cela, j'ai obtenu mon pull request avec environ 30 s'engage avec 2-3 fusionne de maître + fixation de conflits. Et après cela, je me suis clair PR avec un commit.
P. S. voici bash script pour ce faire des mesures en mode auto.
$ git checkout master
$ git log --oneline
$ git rebase --sur la TÊTE^^^ la TÊTE^
$ git log --oneline
--oneline
? Et il semble que vous avez abandonnéC
etB
, ce qui n'est pas ce que l'OP a été l'intention.git show A
) et D, C et B ont été perdu dans ma ref-journal. Dûgit rebase D
pour revenir.