07/03/2018

Git

Liste des commandes

Utiliser un gitlab, github…

Pour mettre en ligne un projet git il faut connaitre 2 commandes globalement :

Il faut faire ces commandes dans l’ordre :

  1. D’abord un pull on récupère en local et on gère les conflits
  2. 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 :

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.

  1. 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
  1. 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

  1. git rebase -i HEAD~[nbcommit(HEAD compris)]

  2. Changer les pick en squash sur les commits à écraser

  3. 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 :

  1. Se placer sur la branche à conserver (B)
git checkout [B]
  1. 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”
  1. Repasser sur la branche A
git checkout [A]
  1. 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

  1. Creation du depot
git init --bare /home/git/depot/monsite.com.git  --> sauvegarde dépot
chmod -R 777 /home/git/depot
  1. 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.

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'
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'
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'