{{tag>programmation}}
----
{{ https://png.icons8.com/windows/540/git.png?100}}
====== Git ======
**Git** est un logiciel de gestion de versions décentralisé. Il est conçu pour être efficace tant avec les petits projets, que les plus importants.
Git a spécialement été créé pour le développement du noyau linux.
Ce projet a débuté en 2005, Linus Torvalds voulait créer une alternative au logiciel propriétaire BitKeeper. Depuis, Git a beaucoup évolué et est utilisé par de nombreux projets.
Contrairement à des outils comme SVN ou CVS, Git fonctionne de façon décentralisée, c'est-à-dire que le développement ne se fait pas sur un serveur centralisé, mais chaque personne peut développer sur son propre dépôt. Git facilite ensuite la fusion (//merge//) des différents dépôts.
===== Installation =====
Pour pouvoir utiliser Git, il suffit d'[[:tutoriel:comment_installer_un_paquet|installer le paquet]] **[[apt>git]]**.
Git dispose également de nombreux plugins, les plus utilisés sont dans les dépôts :
* [[apt>git-lfs]] : Gestion des //gros// fichiers, notamment binaires (large file storage) ([[https://github.com/git-lfs/git-lfs/wiki/Tutorial|tuto (en)]])
* [[apt>git-svn]] : Gestion des dépôts [[:subversion|SVN]] ;
* [[apt>git-cvs]] : Gestion des dépôts [[:cvs|CVS]] ;
* etc.
===== Configuration =====
Une fois l'installation réalisée, il faut impérativement définir le paramètre [user]. Pour cela, [[:tutoriel:comment_editer_un_fichier|éditez le fichier]] caché **''.gitconfig''** se trouvant dans votre dossier personnel :
[user]
email = p.nom@ubuntu-fr.org
name = nom_programmeur
[alias]
ci = commit
co = checkout
st = status
br = branch
Les alias quant à eux permettent de raccourcir les commandes, exemple : ''git st'' au lieu de ''git status''((autres exemples sur : [[https://touticphoto.fr/developpement/14-git-pour-la-gestion-de-depot-de-codes-source-resume]]))
Avec les récentes versions de git (notamment la v2.25), les messages retournés par git sont assez bien traduits. Mais pour remonter des problèmes sur des forums ou dépôts en anglais, ça peut-être bien de pouvoir les avoir en anglais.\\
Pour cela, vous pouvez modifier la langue de votre système, ce qui est assez extrême, ou simplement définir un [[:alias|alias]],\\
dans votre fichier //~/.bash_aliases//, ajouter, par exemple, la ligne :\\
alias giten='LANGUAGE=en_GB:en_Us git'
ainsi, **git** continue a retourner des commentaires en français, et **giten** les retournent en anglais.
==== Utilisation sur un serveur web ====
Si vous utilisez git pour récupérer le code d'un projet web, il est important d'éviter que le répertoire //.git// soit dans le répertoire exposé sur le web, auquel cas, un hacker peut facilement y accéder par l'url : exemple.fr/.git\\
Il est également possible d'ajouter (avec un serveur [[apache2|apache]]) un fichier :
RedirectMatch 404 /\.git
C'est tout l'intérêt de la structuration des frameworks avec un répertoire //public// qui évite d'exposer la racine du projet, et d'un fichier .env ou équivalent pour que les mots de passe n'apparaissent pas dans le code
===== Utilisation basique =====
==== Gérer les dépôts ====
Avant de commencer à utiliser Git, il faut lui demander de créer un nouveau dépôt.
mkdir nom_depot
cd nom_depot
git init
Dans le répertoire ''nom_depot'', vous aurez alors un dossier caché ''.git'', c'est dans ce dossier que Git stockera les différentes révisions et informations du projet.
Vous pouvez aussi récupérer un dépôt déjà existant et travailler à partir de celui-ci en faisant
git clone git://
ou
git clone https://
Vous pourrez ensuite (si vous avez les droits suffisants sur le dépôt distant), envoyer vos changements avec ''git push''.
==== État du dépôt ====
git diff
git diff
Permet de comparer 2 versions. Vous pourrez ainsi voir les changements effectués. Si vous avez des changements pas encore //commités//, la commande ''git diff'' affichera les modifications effectuées depuis le dernier //commit//.
git status
Savoir tout ce qui n’a pas encore été validé
git log
Liste les //commits// effectués dans le dépôt. Vous pourrez ainsi voir les modifications qui ont été faites.
==== Gestion des fichiers ====
git add
Cette commande indique à Git que le fichier (ou dossier) nommé "nom_fichier_ou_dossier" devra être versionné.
git add --all *
Permet d'ajouter tout le contenu (fichier et dossier) du dossier.
git rm
Supprime le fichier de votre ordinateur, ainsi que du dépôt Git.
git mv
Déplace le fichier.
==== Gestion des commits ====
git pull
Met à jour votre dépôt local (à faire avant de commencer à modifier des fichiers pour être sûr de travailler sur leurs dernières versions et avant tout //commit// pour éviter les éventuels conflits avec des modifications effectuées par d'autres utilisateurs entre temps).
git commit
Crée un //commit// contenant fichier1 et fichier2. Ces fichiers auront dû être au préalable ajoutés au dépôt avec la commande ''git add''.
> Il s'agit de la validation d'une transaction. Après avoir commis la transaction, les informations traitées par cette transaction seront disponibles pour les autres sessions, c'est-à-dire pour toute autre transaction éventuelle.
> → [[wp>Commit]]
git commit -a
Crée un nouveau //commit// contenant tous les changements effectués sur les fichiers (''git add'' n'est donc pas nécessaire avant un ''commit -a'').
git push origin master
Envoie le //commit// dans la branche principale "master" du dépôt "origin".
==== Commandes d'annulation ====
Git dispose de commandes permettant d'annuler des changements effectués. **Attention, ces annulations ne sont pas réversibles** !
^ Commande ^ Effet ^
| ''git reset --hard HEAD'' | Annule les changements effectués depuis le dernier //commit//. |
| ''git reset --hard HEAD^'' | Supprime le dernier //commit//. Cette action peut être répétée autant de fois que vous le désirez. |
| ''git revert commit'' | Restaure le dépôt tel qu'il l'était lors du //commit// spécifié.|
| | Pour que cette commande fonctionne, il faut que toutes les modifications soient //commitées//|
| | (ou annulées avec ''git reset''). |
===== Utilisation avancée =====
Généralement, quand on utilise Git, on ne travaille pas seul mais en équipe. Voici les principales commandes qui vous aideront à utiliser Git dans de telles situations.
Ici, nous supposerons qu'on travaille avec deux dépôts Git distincts nommés respectivement moi et bob. Le dépôt moi est votre dépôt, bob est celui d'une autre personne, admettons qu'il est situé à l'adresse [[git://github.com/bob]]
==== Gestion des branches ====
Git permet une gestion efficace des branches, et des //merges// (fusion de branches). Les branches permettent d'avoir simultanément plusieurs versions de votre programme dans votre dépôt Git. C'est très utile, par exemple pour développer une nouvelle fonctionnalité, tout en gardant la branche principale intacte. Ainsi, vous pouvez toujours faire des changements dans la branche principale (corrections de bugs par exemple), tout en développant en parallèle une nouvelle fonctionnalité.
git branch test
Crée une nouvelle branche nommée "test".
git branch
Liste les branches présentes dans le dépôt. Le nom de la branche courante est précédé du caractère "*".
git checkout
Change de branche. Après cette commande, vous aurez alors accès aux fichiers présents dans la branche nommée "nom_branche".
Avant de changer de branche, il faut impérativement que tous les changements effectués soient //commités// ou annulés, sinon Git refusera de changer de branche.
git merge
Fusionne la branche courante avec la branche nommée "nom_branche". Il se peut qu'il y ait des conflits et que Git ne soit pas capable de les résoudre tout seul. Les conflits apparaissent lors de changements divergents au même endroit dans un fichier. Si il y a des conflits, Git laissera un marquage directement dans le fichier, contenant le code de la branche courante, et celui de la branche que vous voulez fusionner. Vous devrez alors corriger le problème manuellement. Une fois corrigé, vous devez //commiter// les changements pour finaliser le //merge//.
Si jamais vous décidez d'abandonner la fusion, alors exécutez la commande :
git reset --hard HEAD
==== Récupération des changements ====
Imaginons que Bob ait implémenté une nouvelle fonctionnalité. Vous voulez naturellement l'intégrer à votre dépôt.
git remote add bob git://github.com/bob
git fetch bob
git merge bob/master
La première commande crée un alias qui fait pointer bob vers l'adresse du dépôt. Ça permet d'éviter d'avoir à taper l'adresse complète à chaque fois. La deuxième commande récupère les changements que bob a effectués. La troisième commande fusionne les changements de bob avec votre branche courante.
Il existe une commande qui a le même effet que ''git fetch'' suivi de ''git merge'' :
git pull bob
===== Voir aussi =====
==== Interfaces graphiques ====
* **(en)** [[https://live.gnome.org/giggle|Giggle]] (GTK+)
* **(en)** [[https://github.com/krig/git-age|git-age]], interface graphique pour la commande [[http://www.alexgirard.com/git-book/5_trouver_les_probl%25C3%25A8mes_-_git_blame.html|git blame]] (PyGTK)
* **(en)** [[https://github.com/git-cola/git-cola|git-cola]] (PyQt)
* **(en)** [[https://github.com/gdevic/GitForce|GitForce]] (Mono)
* [[apt>gitg]] (GTK+)
* [[apt>git-gui]] et [[apt>gitk]], interfaces graphiques (Tcl/Tk) livrées avec Git
* [[apt>qgit]] (Qt)
* **(en)** [[https://github.com/qgrit/qgrit/wiki|qgrit]], interface graphique pour la commande [[http://www.alexgirard.com/git-book/4_recombinaison_interactive.html|git rebase -i]] (Qt)
* **(en)** [[http://www.rabbitvcs.org/|RabbitVCS]] (PyGTK)
* **(en)** [[http://www.syntevo.com/smartgithg/|SmartGit]] (propriétaire ?)
* **(en)** [[https://github.com/gyim/stupidgit/wiki|StupidGit]] (wxPython)
* **(en)** [[http://www.devslashzero.com/teamgit|Team Git]] (Qt)
* **(en)** [[http://jonas.nitro.dk/tig/|Tig]], interface en mode texte
* **(en)** [[https://github.com/FredrikNoren/ungit|Ungit]] Interopérable (Linux, Mac, Windows) et moderne
* **(en)** [[https://www.gitkraken.com/|GitKraken]] Linux, Windows et Mac
==== Autres outils autour de Git ====
* **(en)** [[http://www.eclipse.org/egit/|EGit]], extension ajoutant le support de Git dans Eclipse
* **(fr)** [[:gitolite|Gitolite]]: outil de gestion de dépôts Git avec utilisateurs, droits, etc.
* **(fr)** [[https://gogs.io/|Gogs]]: serveur de gestion de dépôts comme Gitolite avec interface http(s) inclus par défaut.
* **(en)** [[http://philjackson.github.com/magit/|Magit]], intégration de Git dans Emacs.
* **(en)** [[https://www.vim.org/scripts/script.php?script_id=2975|Fugitive]], Intégration de Git dans Vim.
* [[:gource|Gource]], Visualiser l'activité de votre dépôt dans une animation qui traverse le temps.
* **(en)** [[http://goodies.xfce.org/projects/thunar-plugins/thunar-vcs-plugin|thunar-vcs-plugin]], permet l'accès aux dépôts Git et [[:Subversion]] via [[:Thunar]]. Le paquet [[apt>thunar-vcs-plugin]] est disponible pour **Ubuntu versions [[:precise|12.04]] & +**.
* [[apt>kdesdk-dolphin-plugins]] permet l'utilisation de l'overlay des dépôt de versionning (pas uniquement git) dans [[:dolphin]]. (activable par services dans les paramètres)
* **(en)** [[https://github.com/nvie/gitflow|Git-flow]], gestion avancées des branches dans une logique projet : **(en)**[[http://nvie.com/posts/a-successful-git-branching-model/|Un modèle de branches concluant pour Git]]. Le paquet [[apt>git-flow]] est disponible pour **Ubuntu versions [[:precise|12.04]] & +** **(dépôts "universe")**.
* **(fr)** [[http://actual-it.info/2013/gitg/|GITg]], GIT en mode graphique - Tutoriel d'utilisation de GITg
* **(en)** [[https://git-lfs.github.com/|git-lfs Large File Storage]], gestion des fichiers lourds associés au projet: fichiers audio, vidéo, jeux de données (test…), graphiques… qui sont déposés sur un serveur à part.
* **(fr)** [[:meld]] qui peut-être utilisé pour gérer les conflits de fusion (merge), pour le configurer : git config --global merge.tool meld
et l'appeler git mergetool
==== Principaux sites concernant Git ====
* **(en)** [[https://git-scm.com/|Le site officiel de git maintenu par Scott Chacon]] ;
* **(fr)** [[https://git-scm.com/book/fr|le livre en français sur le site officiel]];
* **(en)** [[http://git.or.cz/index.html|Le site officiel de git maintenu par Petr Baudis]] ;
* **(en)** [[http://www.kernel.org/pub/software/scm/git/docs/user-manual.html|Manuel utilisateur Git]] : Une référence très complète ;
* **(fr)** [[http://www.alexgirard.com/git-book/index.html|Le livre communautaire (libre et gratuit;) entièrement dédié à Git]] ;
* **(fr)** [[http://gitimmersion.fr|Git immersion en français]], un des guides références anglais traduit en Français
==== Principaux dépôts Git ====
* [[http://github.com|GitHub]] : très bon dépôt gratuit. Une bonne gestion du travail en équipe, avec la possibilité de forker un dépôt, pour contribuer au développement sur son propre dépôt, tout en gardant un contact étroit avec le dépôt original. Appartient à microsoft depuis 2018.
* [[http://www.gitorious.org/|Gitorious]] : utilisé par de gros projets comme le framework Qt. A noter que le site web gitorious est un logiciel libre et donc installable sur son propre serveur à l'inverse de GitHub qui est propriétaire. Les fonctionnalités communautaires des 2 me semblent assez proches.
* [[https://bitbucket.org/|BitBucket]] : concurrent de Github. Propose de faire des __dépôts privés__ gratuits (jusqu'a **5 utilisateurs** sur le même dépôt. Pas d'autre restriction).
* [[https://github.com/gitlabhq/gitlabhq|GitLab]] : [[tutoriel:comment_installer_gitlab-ce_avec_docker_pour_son_poste_de_travail|Comment installer Gitlab-ce avec Docker pour son poste de travail]]. Logiciel open-source de dépôt, à installer sur sa machine depuis les sources [[https://github.com/gitlabhq/gitlabhq/blob/master/doc/install/installation.md|Manuel d'installation]].
* [[https://framagit.org|FramaGit]] : dépôt fonctionnant sous GitLab géré par FramaSoft, une alternative aux dépôts propriétaires comme GitHub.
==== Autres ====
* **(fr)** Discussion [[https://forum.ubuntu-fr.org/viewtopic.php?id=692171|«Conversion d'un dépôt bzr en un dépôt git»]] sur le forum ubuntu-fr.
* [[https://forum.ubuntu-fr.org/viewtopic.php?id=1310241|Création rapide de serveur git avec tutoriel]]
* **(fr)** [[http://blogs.media-tips.com/bernard.opic/2013/12/01/initiez-vous-a-git-avec-laide-memoire-interactif-dandrew-peterson/|Aide-mémoire interactif]]
* **(fr)** [[http://www.chtiland.fr/page.php?id=informatique:developpement:start#docs|Aide mémoire GIT au format PDF]]
----
//Contributeurs principaux : [[utilisateurs:geenux]], [[utilisateurs:bcag2]].//