Faire un cherry-pick en ligne de commande :
1) Tirer la branche sur laquelle se trouve le commit recherché :
git pull monRemote maBrancheSource
2) Récupérer le hashé complet du commit.
3) Se placer sur la branche cible :
git checkout maBrancheCible
4) Copier le commit :
git cherry-pick HASH_DU_COMMIT
Pour squash et rebase :
1) Se placer sur la branche master (ou main si ça vous chante) et la mettre à jour :
git checkout master
git pull origin master
2) Se placer ensuite sur la branche à rebaser :
git checkout maBranche
3) Décider du nombre de commits à squasher (ici 5) :
git rebase -i HEAD~5
Ou trouver le hash du commit précédant le premier commit à squasher :
git rebase -i b0ce09a46ae1e130141f11841cd66db000a4712b
4) Pousser le code sur le remote :
git push --force origin maBranche
5) Ne pas hésiter à remettre à jour la branche master. Puis revenir sur la branche maBranche et rebaser sur master :
git checkout master
git pull origin master
git checkout maBranche
git rebase master
6) Résoudre les conflits de merge avec l'éditeur de texte qui va bien, puis pousser vers le remote :
git push --force origin master
7) Finalement, retourner sur la branche master, merger la branche maBranche et pousser les commits vers le remote :
git checkout master
git merge maBranch
git push origin master
Voilou !
Pour mémoire. Je connaissais le hard reset, pour supprimer le dernier commit :
git reset --hard HEAD~1
Mais il existe aussi le soft reset :
git reset --soft HEAD~1
La différence ? Le hard reset supprime à la fois le commit et les changements (dans le code). Alors que le soft reset supprime le commit mais conserve les changements correspondants (ceux-ci reviennent dans l'état "uncommited").
Une fonctionnalité intéressante de git pour récupérer un fichier dans l'état dans lequel il était au moment d'un certain commit. La syntaxe est la suivante :
git cat-file -p <NUMERO_DU_COMMIT>:chemin/du/fichier > fichier_de_sortie
Par exemple :
source/scripts/super_script.sh
;9c77d13cbab36a1d60fdf6024af90cecd1e54c8a
;git cat-file -p 9c77d13cbab36a1d60fdf6024af90cecd1e54c8a:source/script/super_script.sh > recovery.sh
Note : le chemin du fichier s'écrit relativement à la racine du répo.