Git
Liste des commandes
-
git init => Initializer un projet git
-
git status => voir l’etat des modification
-
git add [fichier] => ajouter les modification d’un fichier
-
git commit -m “[message]” => Faire un commit
-
git commit –amend => modifier un ancien commit
-
git checkout [identifiant du commit ou nom de la branche] => se deplace dans l’arbre
-
git checkout -b [nom de la branche] => créer une branch et se deplace dedans
-
git merge [nom de la branch à merge] => merge avec une branch. (détail dans la partie merge)
-
git log => Affiche l’historique des commits
Utiliser un gitlab, github…
Pour mettre en ligne un projet git il faut connaitre 2 commandes globalement :
-
git pull => récupérer les modifications
-
git push => Envoyer les modifications
Il faut faire ces commandes dans l’ordre :
- D’abord un pull on récupère en local et on gère les conflits
- Et ensuite un push pour envoyer
Pendant un pull git va merge ta branche master avec la branche origin-master du serveur.
Attention il est déconseillé de modifier un commit (avec un git commit –amend ou git rebase…) qui déjà sur le serveur. Sinon git va créer une branche avec toutes les modif depuis le commit en question. Bref c’est le bordel…
Alias git hist
J’ai ajouté la commande git hist qui permet de visualiser mieux les commits et les branchs. Pour l’ajouter tape la commande
git config --global alias.hist "log --pretty=format:'%C(yellow)[%ad]%C(reset) %C(green)[%h]%C(reset) | %C(red)%s %C(bold red){{ %an }}%C(reset) %C(blue)%d%C(reset)' --graph --date=short"
Il y a deux commande principales pour git hist :
-
git hist => Affiche l’historique jusque HEAD
-
git hist –all => Affiche tout l’historique
Sinon tu peux utiliser la commande git log.
Terme
HEAD c’est l’endroit où tu te situe dans git master c’est la branche principale origin-master c’est la branche principale sur github, gitea, gitlab…
Readme
Une bonne pratique c’est de créer à la racine du projet un fichier readme.md où tu décris ton projet avec l’installation. En plus sur github, gitea… Ils vont mettre en avant ce fichier sur la page d’accueil de ton projet. Le readme s’écrit en markdown
.Gitignore
Avec git on peux empêcher de prendre en compte certains fichier. Par exemple on ne veux pas versionner un fichier de config avec des information sur la base de données. Dans Pour empêcher de versionner un fichier il faut créer un fichier .gitignore et y placer tout les nom des fichiers ou des repertoire que t’a pas envie de versionner.
Pour les fichiers de configs la bonne pratique est de créer un fichier d’exemple avec des données bidon et le versionner et mettre le fichier original dans le gitignore. Après il ne faut pas oublier de spécifier cette manipulation dans le readme.md
Merge une branch
Pour merge une branche A
sur une branche B
, il faut se déplacer sur la branche B
.
Et tapez la commande :
git merge [nom de la branche A]
Git va réunir les deux branches et créer ce que l’on appel un commit de merge. Si un fichier à été modifier au même endroit alors tu peux avoir des conflits. Sur la console git explique comment résoudre ces conflits mais en rêgle générale tu modifies le code pour obtenir un truc qui fonctionne et tu tape la commande git commit pour que le merge continu. Pendant un merge tu peux annuler l’operation en faisant git merge –abort.
Pour merge une branche en gardant que les modifs distante
git merge -Xtheirs [branch]
Deplacer des commits
Il est possible de deplacer les derniers commit dans une autre branche.
- Il faut avoir une branche à jour avec master. Vous pouvez la créer :
git checkout master
git branch [branch-name]
1 bis. OU mettre à jour la branche
git checkout [branch-name]
git merge master
git checkout master
- Ensuite fusionner les derniers commit à déplacer Ne vous inquieté pas, ils sont encore dispo sur la nouvelle branche
git reset --hard HEAD~[number-commit]
OU
git reset --hard [first-commit-name]
Et voila, les commits sont deplacer sur la nouvelle branche et master est revenu dans son etat initial
Fusion des commits
-
git rebase -i HEAD~[nbcommit(HEAD compris)]
-
Changer les pick en squash sur les commits à écraser
-
Selectionner le bon titre de commit en commantant les titres nul à chier
Remplacer une branche par une autre
On souhaite remplacer une branche A par une branche B :
- Se placer sur la branche à conserver (B)
git checkout [B]
- Demander une fusion avec la stratégie ours (attention, ceci est différent d’un merge avec stratégie recursive et l’option ours) qui va uniquement conserver le contenu de la branche actuelle. En effet, l’option -s ours indique à Git de fusionner la branche source dans la branche cible mais sans aucunement modifier la branche cible. Cette stratégie est habituellement utilisée pour ne pas reporter un commit d’une branche de maintenance sur le master.
git merge -s ours [A] -m “Mergouille”
- Repasser sur la branche A
git checkout [A]
- Demander une fusion de la branche maBranche vers le master tout en conservant 2 branches distinctes (un fast-forward aurait été réalisé puisque que le dernier commit n’est autre que notre fusion de la commande n°2).
git merge –no-ff [B]
Annuler un rebase
git reflog contient la liste de toutes les actions y compris les rebase, checkout…
Le principe est de se repositionner juste avant le commit de rebase
git reset --hard [commit-tag]
Attention, l’historique de git reflog à une durée de 90j
Recuperer un fichier sur une autre branche
Récupérer un fichier sur git Sur la branche A, récuperer le fichier main.cpp de la branche B git checkout B – src/main.cpp
Supprimer une branche
Pour supprimer une branche locale :
git branche -D [nom-branche]
Pour supprimer une branche distante :
git push origin --delete [nom-branche]
Creation du depot distant sur le serveur
- Creation du depot
git init --bare /home/git/depot/monsite.com.git --> sauvegarde dépot
chmod -R 777 /home/git/depot
- clonage depot en local
git clone ssh://user@ip/home/git/depot/monsite.com.git
Voilà c’est les trucs principaux. Tu va surement rager au début, mais après ce sera cool ;)
Les sous-modules
Un sous-module est un depot git dans un autre depot git. Il est utilisé dans certains cas assez précis. Dans une library.
Ajouter un sous-module :
git submodule add [url] [name]
Initialiser les sous-modules :
git submodule update --recursive --init
Mettre à jours
git submodule update --remote
Les subtree
Les substree est une version amélioré des sous-modules. Avec ce système vous pouvez par exemple diviser un projet web en back et front et les rassembler dans un projet principale.
Pour commencer, il faut ajouter les alias qui permettent de lier les depots entre eux sur le projet principal.
- Ajouter un substree
git config alias.[alias] 'subtree add --prefix [folder] [chil-repo] [branch] --squash'
ex:
git config alias.badd 'subtree add --prefix st git@176.31.181.127:Aarkalo/p1.git master --squash'
- Pull
git config alias.[alias] 'subtree pull --prefix [folder] [chil-repo] [branch] --squash'
ex:
git config alias.bpull 'subtree pull --prefix st git@176.31.181.127:Aarkalo/p1.git master --squash'
- Push
git config alias.[alias] 'subtree push --prefix [folder] [chil-repo] [branch]'
ex:
git config alias.bpush 'subtree push --prefix st git@176.31.181.127:Aarkalo/p1.git master'
Maintenant pour ajouter le projet tapez git [alias]
Attention, le projet doit avoir au moins un commit
Le cache
Cette commande ci-dessous permet de garder le mot de passe pendant un certains temps en cache.
Le temps est en seconde
git config credential.helper 'cache --timeout=1000000'