143 votes

Existe-t-il un moyen d'écraser un certain nombre de commits de manière non interactive?

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?

175voto

wilhelmtell Points 25504

Assurez-vous que votre arbre de travail est propre, puis

 git reset --soft HEAD~3
git commit -m'new commit message'
 

38voto

n8tr Points 686

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 '----------------'

10voto

Julien Wajsberg Points 21

J'ai utilisé:

 EDITOR="sed -i '2,/^$/s/^pick\b/s/'" git rebase -i <ref>
 

Travaillé assez bien. Juste n'essayez pas d'avoir un journal de commit avec une ligne qui commence par "pick" :)

-1voto

Greg Bacon Points 50449

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X