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 mettre à jour des identifiants git sous Windows, aller dans :
Puis cliquer sur le lien de l'url git pour mettre à jour les identifiants correspondants.
Je ne me souviens jamais de la commande, du coup j'en mets deux ici :
[alias]
lg1 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all
lg = !"git lg1"
A mettre dans le ~/.gitconfig
, ou dans le ~/.bashrc
.
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").
Pour mémoire je remet la manip ici.
Je souhaitais pouvoir transférer l'intégralité d'un répo d'un serveur à un autre (branches, tags, ...).
1) Je clone le répo en local sur mon PC :
git clone --mirror https://USERNAME:PASSWORD@URL_REPO_SOURCE
Ca donne un répertoire dont le nom se finit en ".git".
Note : Les USERNAME et PASSWORD ne sont nécessaires que si une configuration globale contenant d'autres credential a été sauvegardée. De plus, le répo sera créé avec ces credentials apparaissant en clair dans le remote (git remote -v
). Attention donc aux indiscrétions ...
Pour mettre ce répo à jour par la suite (en tirant les changements depuis ce remote) :
git remote update
2) Je crée un répo vide dans le serveur cible. Vraiment vide, ie sans même le fichier README.md qui peut être créé à l'initialisation du répo.
3) Je pousse vers le répo cible :
Normalement, on devrait pouvoir faire ceci :
git push --mirror https://URL_REPO_CIBLE
Mais ça n'a pas fonctionné quand j'ai testé. L'erreur donnée par git dit que l'API distante est injoignable.
Bref. Sinon ça marche aussi comme ça :
git push --all https://URL_REPO_CIBLE
git push --tags https://URL_REPO_CIBLE
Il faudra que je vérifie que ces deux commandes push (--all et --tags) envoient bien toutes les datas vers le répo cible.
Supprimer une branche en local :
git branch -D maBranche
Supprimer une branche distante :
git push alias-du-repo-distant --delete maBranche
Petit pense-bête : commande pour rapatrier tous les tags d'un remote :
git fetch remoteRepo --tags
Supprimer tous les fichiers qui viennent d'être ajouté et qui ne sont pas encore commités dans git :
git reset
Pour enlever un seul fichier :
git reset mon_fichier
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.
Quand il faut cloner un répo vide:
# Cloner le répo
git clone URL
cd REPO
# Créer un fichier bidon
touch fichier_bidon
# Commiter le fichier
git commit
# Faire un git push
git push origin master
# Supprimer le fichier bidon
rm fichier_bidon
Un livre façon site web sur Git, qui a l'air assez bien fait. Et il est disponible en plusieurs langues!
Quand le mec qui gère un repo distant ne crée pas de certificat SSL, ça donne ça:
git push origin master
fatal: unable to access 'https://truc.machin.fr/mon/repo/': server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none
Pour contourner ce grave problème de sécurité, il faut lancer la commande suivante dans le repo local:
git config http.sslVerify "false"
Il ne reste plus qu'à remettre la tête dans le sable...
Edit : S'il s'agit d'un répo devant être cloné :
GIT_SSL_NO_VERIFY=true git clone https://url
cd directory/
git config http.sslVerify "false"
Pour enregistrer les login et mdp d'un répo git, et éviter de les taper à chaque fois:
git config credential.helper store
git pull # (ou git push)
--> Taper le login/mdp demandés
Ils sont alors enregistrés, et ne seront plus demandés à l'avenir.