J'ai trouvé la réponse de @sky utile. Et j'en ai fait une fonction squash-rebase.
En supposant que vous êtes sur votre-branche
, ce que cela fait est de créer une branche votre-branche-tmp
qui est le résultat de faire merge --squash
sur main. Il préserve également tous les messages de commit et vous permet de les éditer. Importamment, cela laisse également votre branche actuelle inchangée.
Après avoir exécuté squash-rebase, si vous êtes satisfait de ce qu'il a fait, vous devez effectuer une réinitialisation complète sur la branche tmp. Ensuite, vous avez effectivement terminé un squash rebase.
function squash-rebase() {
MESSAGES="$(git log $(git merge-base main HEAD)..HEAD --reverse --format=%B)"
SRC_BRANCH="$(git_current_branch)"
TMP_BRANCH="$(git_current_branch)-tmp"
echo "création de la branche temporaire $TMP_BRANCH à partir de $(git_current_branch)"
git checkout -b $TMP_BRANCH main # créer la branche tmp à partir de main et checkout
git merge $SRC_BRANCH --squash
git commit -m "$MESSAGES" -n
git commit --amend -n # juste pour pouvoir éditer les messages
git checkout $SRC_BRANCH
echo "IMPORTANT : exécutez git reset --hard $TMP_BRANCH pour terminer le squash rebase."
echo "Tout d'abord, vous pouvez exécuter git diff $TMP_BRANCH pour vous assurer qu'il n'y a pas de changements."
echo "Enfin, supprimez la branche tmp avec git branch -D $TMP_BRANCH"
}
Remarque : cela suppose que vous utilisez oh-my-zsh, sinon vous devrez trouver un autre moyen d'obtenir le nom de la branche actuelle.