Versionner son code avec Git

Pour suivre ce tutoriel, il faut bien sur avoir un compte sur GitHub. L'accès est gratuit et très réputé au près des développeurs : https://github.com

Après avoir suivi ce tutoriel, nous allons pourvoir organiser notre code source avec Git.

  • Pour les utilisateurs de Windows, Git est disponible sur le site officiel Git-scm.com.
  • Pour les utilisateurs de GNU/Linux, Git est disponible depuis les dépôts de Debian ou d'Ubuntu.

Pour visualiser les branches facilement, nous pouvons utiliser l'utilitaire gitg ou grv.

Pré-requis

Pour commencer, son installation est simple sous Linux puisqu'il suffit de faire :

apt install git

Les fichiers de configurations se situent dans :

  • /etc/ggitconfig = contient la liste des dépôt et utilisateurs
  • ~/.gitconfig = contient des infos de l'utilisateur en question
  • projet/.git/config = contient les infos sur le projet

Ainsi la configuration minimale doit être dans le fichier ~/.gitconfig :

[user]
    name = Bruno Tatu
    email = brnotatu@domaine.com
[pull]
    rebase = true
[push]
    default = simple
[core]
    editor = vim

Mémorisation du mot de mot de passe durant 15 minutes :

git config --global credential.helper cache

Travailler dans son dépôt

Dans le cas d'un développement seul sans collaborateur, on peut commencer par initier son dépôt en local :

mkdir projet && cd projet
git init
  • Si l'on récupère un dépôt distant :
git clone https://your_repository.git
  • Ajouter un ou plusieurs nouveau(x) fichier(s) à la branche courante :
git add fichier1 fichier2 fichier3
  • Expliquer pourquoi on effectue ces modifications :
git commit -m "Mon intitulé"
  • S'il y a eu juste une modification aux fichiers déjà présent :
git commit -am "Mon nouvel intitulé"
  • Annuler le dernier commit :
git commit --amend
  • Voir l'historique des commits :
git log
git log --graph --date-order
  • Vérifier que l'on a pas oublié de nouveaux fichiers :
git status
  • Envoyer les modifications au dépôt :
git push

Créer sa branche de travail

Admettons que nous voulons travailler sur un projet spécifique sans vouloir déranger le branche principal :

git checkout -b nouvelle-branche

Après quelques modifications d'un code source et après avoir commité ;

  • Informer le serveur distant de la nouvelle branche (facultatif) :
git push -u origin nouvelle-branche

-u équivaut à –set-upstream

  • Fusionner les branches projet-dev avec /master (n'oublions pas de mettre à jour le dépôt local) :
git pull
git checkout master
git merge nouvelle-branche
  • Nous pouvons supprimer la branche :
git branch -d nouvelle-branche

Éditer le projet sur une nouvelle branche (fork)

Admettons que l'on souhaite participer à un projet libre, on télécharge le projet puis on créer notre propre branche.

  • On télécharge le projet :
git clone https://github.com/Fusing/irc2telegram.git
  • On peut créer une nouvelle branche :
git checkout -b nouvelle-branche
  • Proposer ses modifications au mainteneur du projet :
git request-pull origin/master nouvelle-branche
#
git push
# ou
git checkout master
git merge nouvelle-branche
  • Supprimer la nouvelle branche (locale et distante) :
git branch -d nouvelle-branche
git push origin --delete branche2

Un commit de retard

Il peut arriver qu'un collaborateur push un commit avant le vautre alors que l'on a oublier de faire un pull juste avant son propre commit. Dans ce cas, il est possible de déplacer notre commit vers la dernière position du commit en cours.

  • Déplacer nos commit de notre branche après le dernier commit de la branche master :
git rebase master
  • Annuler son souhait :
git rebase --abort
  • Déplacer uniquement des commit précis dans la branche master :
git cherry-pick <SHA1> <SHA1>

Gérer les dépôts distant

  • Inspecter un dépôt :
git remove show origin
  • Renomer un dépôt distant :
git remove rename ancien-nom nouveau-nom
  • Supprimer un dépôt distant :
git remote rm dépôt
  • Changer le dépôt :
git remote set-url origin git@gitea.$DOMAIN.org:$DOSSIER/$NOM-DEPOT.git

Gestion des versions

  • Ajouter un tag :
git tag v0.01
  • Voir le contenu d'un tag :
git show v0.01
  • Envoyer le tag sur le serveur :
git push origin --tags

Corriger son dernier commit

  • Ajouter un fichier ou une modification faite dans un fichier :
git add mon-fichier-editer
  • Indiquer à git d'éditer le dernier commit :
git commit --amend

Remisage

  • Mettre en mémoire les modification (même pour les fichiers non indexés) :
git stash -u
  • Appliquer la modification que l'on avait mise de côté :
git stash apply [stash@{2}]
git stash drop [stash@{2}]
  • Appliquer toutes les modifications et supprimer en même temps celles-présent en mémoire :
git stash pop
  • Afficher le contenu d'une modif :
git stash show -p stash@{2}

Cloner une seule branche

Admettons que le projet est gros et que nous avons une faible bande passante. Il sera alors intéressant de télécharger qu'une seule branche :

git clone -b branche1 --single-branch http://git.bruno-tatu.com/test.git

On voudrait merger le travail mais on a besoin de la branche principale (master). Il faudra alors éditer le fichier suivant :

nano .git/config

et remplacer le mot branche1 par master et indiquer que l'on accepte le rebase :

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = http://git.bruno-tatu.com/test.git
        fetch = +refs/heads/master:refs/remotes/origin/master
[branch "master"]
        remote = origin
        merge = refs/heads/master
        rebase = true

Il restera plus qu'a faire la récupération :

git fetch origin

Cloner une seconde branche

Il est possible de télécharger une seconde branche sans avoir celle du master :

git remote set-branches --add origin branche2
git fetch origin branche2:branche2
git checkout branche2

Suite aux modifications, faites un commit pour l'envoyé sur le serveur :

git add fichier3.txt 
git commit -am "ajout fichier3-branche2"
git push -u origin branche2

D'autres commandes

  • Créer des alias :
# faire "git a"
git config --global alias.a add

# faire "git l"
git config --global alias.last 'log -3 HEAD'

# faire "git s"
git config --global alias.s status
  • Revenir à une version ultérieure :
git reset --hard <tag/branch/commit id>
git revert <commit id>
  • Ignorer des dossiers et fichiers en spécifiant leur emplacement :
nano .gitignore
_site/
git rm --cached _site/ -r
  • Voir les différences :
git diff
  • Régler les problèmes de conflits suite à un merge :
git mergetool
  • Supprimer un fichier distant :
git rm fichier.txt
  • Déplacer un fichier
git mv fichier.txt destination/fichier.txt
  • Pousser une branche (branche1) vers une autre (branche2) :
git push origin branche1:branche2
  • Renommer une branche :
git branch -m ancien nouveau
  • Désindexe un fichier :
git reset HEAD fichier.txt
  • Tout désindexer :
git reset --hard
  • Savoir qui a modifié un fichier :
git blame fichier.txt
  • Voir l'avant dernier commit :
git show HEAD~1
  • Voir les modifications entre deux commits (de l'avant dernier au 4ème dernier commit):
git show -p HEAD~3..HEAD~1
  • Changer le dépôt d'un dépôt :
git remote set-url origin utilisateur@mon-domaine.com:adresse/depot/utilisateur/distant.git
  • Se déplacer dans une nouvelle branch de travail qui n'a rien à voir avec la base master :
git checkout -B 16 d171d1aff8df2f784c1814ef93a63cdfc3749335 
https://stackoverflow.com/questions/26570242/how-to-move-master-to-head
  • Définir la branche séparé en tant que master
git branch -f master $ID
git checkout master