J'essaie d'écraser une série de commits - HEAD to HEAD ~ 3. Existe-t-il un moyen rapide de procéder ou dois-je utiliser rebase --interactive?
Réponses
Trop de publicités?Personnellement, j'aime wilhelmtell de la solution:
git reset --soft HEAD~3
git commit -m 'new commit message'
Cependant, j'ai fait un alias avec certains de vérification des erreurs, de sorte que vous pouvez le faire:
git squash 3 'my commit message'
Je vous recommande de créer des alias qui fait exécuter des scripts de sorte qu'il est plus facile de (a) du code de vos scripts et (b) ne sont plus complexes, avec la vérification des erreurs. Ci-dessous est un script qui fait le travail de courge puis-dessous qui est un script de configuration de votre alias git.
Script pour les écraser (squash.sh)
#!/bin/sh
#
#get number of commits to squash
squashCount=$1
#get the commit message
shift
commitMsg=$@
#regular expression to verify that squash number is an integer
regex='^[0-9]+$'
echo "---------------------------------"
echo "Will squash $squashCount commits"
echo "Commit message will be '$commitMsg'"
echo "...validating input"
if ! [[ $squashCount =~ $regex ]]
then
echo "Squash count must be an integer."
elif [ -z "$commitMsg" ]
then
echo "Invalid commit message. Make sure string is not empty"
else
echo "...input looks good"
echo "...proceeding to squash"
git reset --soft HEAD~$squashCount
git commit -m "$commitMsg"
echo "...done"
fi
echo
exit 0
Puis de brancher jusqu'à que squash.sh script pour un git alias, faire un autre script pour la configuration de votre alias git comme (create_aliases.commande ou create_aliases.sh):
#!/bin/sh
echo '-----------------------'
echo 'adding git aliases....'
echo '-----------------------'
echo
git config --global alias.squash "!sh -c 'sh <path to scripts directory>/squash.sh \$1 \$2'"
#add your other git aliases setup here
#and here
#etc.
echo '------------------------------------'
echo 'here is your global gitconfig file:'
echo '------------------------------------'
more ~/.gitconfig
echo
echo
echo '----------------'
echo 'end of script...'
echo '----------------'
Vous pouvez être assez proche avec
git rebase --onto HEAD ~ 4 HEAD ~ maître
Cela suppose que vous êtes sur maître avec une histoire linéaire. Ce n'est pas tout à fait une courge, car elle supprime les commits intermédiaires. Vous devez modifier le nouveau HEAD pour modifier le message de validation.