====== 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 [[https://guides.github.com/activities/hello-world/|ce tutoriel]], nous allons pourvoir organiser notre code source avec Git.
* Pour les utilisateurs de Windows, Git est disponible sur le site officiel [[https://git-scm.com/|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
===== 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
git revert
* 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