meta données pour cette page
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