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