Sauvegarder des changements non commit et revenir au dernier commit
Cette commande va mettre de côté toutes les modifications qui ont été apportées au projet depuis le dernier commit :
git stash
OU
git stash save "nom_de_ma_sauvegarde"
Liste toutes les sauvegardes :
git stash list
Cela applique ma sauvegarde :
git stash apply nom_de_ma_sauvegarde
Cela supprime ma sauvegarde :
git stash drop nom_de_ma_sauvegarde
Fusionner des commits
Par exemple je veux fusionner les 4 derniers commits de ma branche :
On peut vous demander de faire ce genre de chose lorsque l'on fait des pulls requests et que les commits s'accumulent.
Le lead developer peut vous demander de fusionner les commits pour pas déglinguer son historique
# git log --pretty=oneline
fc19dc0fde87448cf8e1fa28f124ed2511cb5e8b commit4
a2beae3a5b99beadce897ee461cb915fd86dff1b commit3
3f496110376ad8bb5a5e778b1a9a21c0cecbd8d8 commit2
0f491a1cfa7dcd05eb5304b1bb93cb5e7c097aec commit1
On commence : (je sélectionne les 4 derniers commits)
git rebase -i HEAD~4
Vous devriez avoir ceci
pick 0f491a1c commit1
pick 3f496110 commit2
pick a2beae3 commit3
pick fc19dc0f commit4
# Rebase df23917..a931ac7 onto df23917
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
Il faut utiliser squash, donc il faut éditer de cette manière
pick 0f491a1c commit1
squash 3f496110 commit2
squash a2beae3 commit3
squash fc19dc0f commit4
# Rebase df23917..a931ac7 onto df23917
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
Regardez bien comment j'ai fais, je laisse pick au plus vieux commit que je veux fusionner.
C'est important sinon vous allez avoir une erreur :
Cannot 'squash' without a previous commit
Si vous avez cette erreur recommencer en lançant avant :
git rebase --abort
Une fois que vous avez fini, il faut enregistrer (:wq) avec vim
Il devrait apparaître une nouvelle fenêtre (la même que pour la création des commits).
Car en réalité, on crée un nouveau commit et on supprime les autres pour pouvoir fusionner les commits.
Donc vous indiquez un titre, un message adéquat avec les modifications et vous enregistré.
Et voilà!
Vous pouvez vérifier avec la commande git log, les 4 derniers commit ont été fusionné.
Ensuite pour envoyer cela sur github ou bitbucket, il faut forcer le push avec l'option -f
git push -f origin ma_branche
Compter les commits
Compter tous les commits
git log --pretty=oneline | wc -l
Compter les commits par user :
git shortlog -sn
Supprimer une branche distante
git push origin --delete <nom_de_la_branch>
Faire un tag (Étiquetage)
Très utile pour le versionning son logiciel.
(image github du nombre de release)
Créer un tag sans signature gpg
git tag -a v1.0.0 -m "logiciel version 1.0.0"
Pour créer et signer avec gpg un tag (il faut remplacer l'option -a par -s)
git tag -s v1.0.0 -m "logiciel version 1.0.0"
Lister tous les tags
git tag
Supprimer un tag en local
git tag -d v1.0.0
Supprimer un tag distant
git push origin :v1.0.0
Envoyer un tag sur un dépôt distant
git push origin v1.0.0
Envoyer tous les tags en une seule fois
git push origin --tags
Signer ses commits avec gpg
Générer une clée gpg et l'ajouter à son compte github
https://help.github.com/articles/adding-a-new-gpg-key-to-your-github-account/
https://help.github.com/articles/generating-a-new-gpg-key/
git commit -S
Enregistrez le commit et rentrez la passphrase.
Vous pouvez automatiser cela en ajoutant ceci dans votre configuration .gitconfig
[commit]
gpgsign = true
Vous n'aurez plus besoins d'ajouter l'option -S à chaque commit pour signer un commit 🙂
git-clean
Pour supprimer les fichiers qui ne sont pas traqué par git
Cela va supprimer tous les nouveaux fichiers qui ne sont pas ajouté via git add ou les fichiers déjà commit
git clean -f
Avec l'option -X cela va supprimer les fichiers qui sont ignorés via le fichier .gitignore
git clean -X -f
Avec l'option -d cela supprime les dossiers.
git clean -X -f -d
Supprimer un commit sur sa branch local
Supprime le dernier commit
git reset --hard HEAD~1
Supprime tous les commits postérieur à celui ci "3f496110"
git reset --hard 3f496110 //commit id
Si vous avez déjà poussé le commit, il vous faudra faire ceci pour mettre à jour votre branch distante
git push origin HEAD --force
git-merge
Si vous avez créée une branch pour travailler (disons la branch nouvelle-version
) sur un nouveau changement et que vous avez commit tous les changement, vous pouvez fusionner les deux branch. Généralement on fusionne dans la branch master
git checkout master
git merge nouvelle-version
Ensuite vous pouvez pousser les changements sur votre dépôt normalement
git push origin master
Il faudra penser à supprimer la branch nouvelle-version
lorsqu'elle ne sera plus utilisée
Contribuer à un projet sur une plateforme git comme github
Tout d'abord il faut fork
le projet en question.
Après avoir clone votre fork sur votre machine je vous conseil de créer une branch avant de commencer à coder vos changements.
Exemple:
git clone git://
Créer un commit vide
ça peut être utile pour relancer un service d'intégration par exemple (CI) comme travis ou github action
git commit --allow-empty