2017-01-26 2 views
0

Il me semblait facile de squash vos commits si ce sont vos proches récents (Squash my last X commits together using Git)Comment écraser vos commits quand ne pas être vos proches récents

Mais si je veux écraser quelques commits de ma pension qui ne sont pas les plus récents, disons HEAD~3 à HEAD~6.

Existe-t-il un moyen de le faire?

+0

la réponse est exactement la même que dans la question que vous citez –

+0

vous avez raison @ChrisMaes, ne se rendait pas compte, merci – vaskort

Répondre

2

Cela peut être fait en faisant un rebasage interactif.

Si vous avez branche master à engager A, puis vous avez créé la branche my-branch avec B engage, C, D, E et F. Vous voulez écraser les validations B, C et D en B'.

Assurez-vous que votre branche actuelle est my-branch, et commencer un rebasage interactif:

git rebase -i master 

Cela ouvrira votre éditeur avec la liste des commits qui sont mues. Chaque ligne représente un commit, et le premier mot sur cette ligne indique la commande à exécuter sur ce commit. Laissez la première validation (B) en tant que pick et modifiez les commandes pour les deux prochains commits (C et D) en squash. Enregistrez et fermez l'éditeur.

Après git a terminé le traitement engage B, C et D, un nouvel éditeur ouvrira avec un message de validation pour le nouveau commit B'. Cela contiendra une combinaison des messages de validation des commits d'origine, mais vous pouvez le modifier comme vous le souhaitez. Une fois que le message de validation est ce que vous voulez qu'il soit, enregistrez et fermez l'éditeur.

Une fois git a terminé le traitement du reste des commits sur la branche my-branch, engage sur my-branch sera B', E et F.

Notez que vous ne devez effectuer un rebasage que si vous n'avez pas activé vos validations. Rebasing va changer les hachages de vos commits, ce qui causera des problèmes si quelqu'un d'autre a déjà tiré les commits d'origine.

+0

qui était clean mate, merci – vaskort

0

Si vous n'avez pas publié la branche, vous pouvez réécrire son historique sans aucun effet secondaire. Supposons que l'historique est A-B-C-D-E-F-G-H-I et que le but est d'écraser C-D-E-F-G.

git checkout -b squash_branch G 
git reset C --soft 
git commit 
git cherry-pick H I 

La nouvelle histoire sera A-B-S-H'-I'.

1
git rebase -i HEAD~6 

Puis dans l'éditeur interactif mis squash (vous pouvez abrégez à s) devant les commits que vous voulez squash et laisser les autres comme pick.

Exemple:

pick 043af87 message 
s 8c0fa0e message 
s b6c7116 message 
pick c5d91a3 message 
pick f20898f message 
pick edcbad2 message