J'essaye d'écraser une gamme de commits - HEAD to HEAD ~ 3. Existe-t-il un moyen rapide de le faire ou dois-je utiliser rebase --interactive?
git
interactive
rebase
squash
Phillip
la source
la source
Réponses:
Assurez-vous que votre arbre de travail est propre, puis
la source
git reset --soft HEAD~3 && git commit -m "my message"
git config alias.mysquash '!f(){ git reset --soft HEAD~$1 && git commit ${2:+-m "$2"}; };f'
.git mysquash 3 'some message'
fonctionnera, mais je l'ai également modifié afin d'git musquash 3
omettre complètement l'indicateur -m afin que vous obteniez l'git commit
interface utilisateur interactive dans ce cas.J'aime personnellement la solution de Wilhelmtell :
Cependant, j'ai créé un alias avec une vérification d'erreur pour que vous puissiez le faire:
Je recommande de configurer des alias qui exécutent réellement des scripts afin qu'il soit plus facile (a) de coder vos scripts et (b) d'effectuer un travail plus complexe avec la vérification des erreurs. Vous trouverez ci-dessous un script qui fait le travail de squash, puis ci-dessous un script pour configurer vos alias git.
Script pour écraser (squash.sh)
Ensuite, pour connecter ce script squash.sh à un alias git, créez un autre script pour configurer vos alias git comme ceci ( create_aliases.command ou create_aliases.sh ):
la source
$PATH
namedgit-squash.sh
et il sera automatiquement aliasé en tant quegit squash
. Je n'ai pas changé votre réponse, juste au cas où il y aurait une raison d'utiliser lecreate-aiases.sh
script dont je ne suis pas au courant.Pour ajouter à la réponse de wilhelmtell, je trouve pratique de réinitialiser
HEAD~2
puis de modifier le commit deHEAD~3
:Cela fusionnera tous les commits dans le
HEAD~3
validations de validation et utilisera son message de validation. Assurez-vous de partir d'un arbre de travail propre.la source
J'ai utilisé:
A bien fonctionné. N'essayez pas d'avoir un journal de validation avec une ligne commençant par "pick" :)
la source
Utilisez la commande suivante pour écraser les 4 derniers commits du dernier commit:
Avec l'alias:
Depuis https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig
la source
Voici une ligne pour écraser les 2 derniers commits. Dans cet exemple, le message de l'avant-dernier commit sera conservé. Vous pouvez modifier le message à votre guise.
Cette commande sera très utile si vous créez un alias pour cette commande et utilisez l'alias à la place.
la source
Pour tout écraser depuis que la branche a été dérivée de master:
la source
--reedit-message=HEAD
utilisera le message du dernier commit qui ne fait pas partie de l'écrasement . Ce n'est probablement pas celui que vous souhaitez. Pour obtenir le message du premier commit à inclure , soit (1) remplacezHEAD
par le hachage du commit dont vous voulez que le message soit inclus , ou (2) sautez au premier commit à inclure etgit commit --amend --reedit-message=HEAD
. C'est ce que fait la réponse harmonieuse.Vous pouvez être assez proche avec
Cela suppose que vous êtes maître avec une histoire linéaire. Ce n'est pas tout à fait un squash car il rejette les commits intermédiaires. Vous devrez modifier le nouveau HEAD pour modifier le message de validation.
la source
HEAD~4
comme parent.