# Git : Creation de repo et gestion de conflits
Git est un système de contrôle de version de programmes open source et multiplateforme (windows, macos, linux). Il est très utilisé par les développeurs pour collaborer sur des projets. Github est une entreprise qui fournit un service d'hébergement de dépôts (repositories) git.
Configuration (une seule fois sur votre machine)
------------------------------------------------
```
git config --global user.name "PRENOM NOM"
git config --global user.email "MON@ADRESSE.EMAIL"
```
Information
----------------------------------------
```
git status
```
affiche l'état du dépot (en fait, de la branche courante) : nouveaux fichiers, fichiers modifiés, etc.
```
git log
```
affiche la liste des commits du dépôt (en fait, de la branche courante)
```
git diff
```
ou
```
git diff FICHIERS
```
affiche les différences entre le dépot actuel et le dernier commit (éventuellement, seulement pour les fichiers donnés en argument)
sauvegarde des modifications ("commit")
---------------------------------------
```
git add FICHIERS
```
demande à git de gérer les fichiers FICHIERS (On peut donner plusieurs fichiers en même temps, ou utiliser les motifs du terminal comme "git add *.py")
ATTENTION : le fichier n'est pas sauvegardé par cette commande
```
git commit
```
ou
```
git commit -a -m "MESSAGE"
```
enregistre l'état du dépot (en fait, de la branche courante)
- l'option '-a' permet d'enregistrer __tous__ les fichiers modifiés. Sans elle, il faut faire "git add FICHIERS" avant le "git commit"
:::warning
ATTENTION, les nouveaux fichiers ne sont pas ajoutés par l'option
'-a', il faut impérativement faire "git add FICHIERS" pour les
nouveaux fichiers.
- l'option '-m "MESSAGE"' permet de donner une description de ce commit. Sans cette option, un éditeur de texte (probablement vscode ou vi) sera lancé pour taper la description du commit.
:::
Communication avec un autre dépot
---------------------------------
```
git pull REMOTE
```
ou
```
git pull
```
récupère l'état du dépôt (en fait de la branche) depuis REMOTE. Si un dépot distant est configuré (automatiquement si vous avez récupéré le dépot avec "git clone URL"), vous pouvez omettre REMOTE.
```
git push REMOTE
```
ou
```
git push
```
envoie l'état du dépot (en fait de la branche) vers REMOTE. Si un dépot distant est configuré (automatiquement si vous avez récupéré le dépot avec "git clone URL"), vous pouvez omettre REMOTE.
Importer un nouveau dépot ("fork", "clone")
-------------------------------------------
```
git clone URL
```
récupère un dépot git dans un nouveau répertoire dans le répertoire local courant. Typiquement, URL est récupérée sur github ("Clone or download")
Revenir en arrière
------------------
```
$ git checkout HASH
```
remet le dépot dans l'état correspondant au commit de hash HASH. Le hash d'un commit est affiché par `git log`. Ça ressemble à
```
c21868153d5631b7bff155dbbdaf991b95581ae2
```
(il faut donner au moins les 4 premiers caractères du hash...)
:::warning
Attention, Ceci n'est possible que si vous n'avez aucun changement non enregistré.
:::
:::warning
Attention, il est déconseillé de modifier les fichiers lorsque le
dépot est dans un état antérieur. Au besoin, vous pouvez faire
```
git reset --hard
```
pour remettre votre dépot dans l'état exact du commit correspondant.
:::
```
git checkout master
```
ou
```
git checkout -
```
remet le dépot dans l'état final
Utilisation typique
-------------------
0 - création d'un dépot vide depuis github ("New" depuis la page
"Repositories" de votre compte github)
ou bien
0bis - récupération d'un dépot existant avec `git clone URL`
Lors d'une séance de travail :
1 - synchronisation pour récupérer les changements du dépot central (sur
github)
```
git pull
```
Normalement, il n'y aura jamais de conflit à cette étape.
2/ visualiser les nouveautés avec
```
git log
```
3/ travail, modification de fichiers, création de fichiers, etc.
4/ lorsque vos modifications fonctionnent et sont finies :
```
git add NOUVEAUX_FICHIERS
git commit -a -m "MESSAGE TRES BIEN ECRIT"
```
5/ sauvegarde sur le dépot central
```
git push
```
5/ en cas de conflit (parce que quelqu'un a modifié le dépot central
entre temps), résolution du conflit et nouveau commit :
```
git commit -a -m "fix mon conflit"
git push
```
Pour aller plus loin
--------------------
Lorsque vous maitrisez les commandes et concepts précédents, vous pouvez
vous renseigner sur
- les "branches" qui permettent d'avoir plusieurs versions du dépots "en parallèle"
- les "remotes" qui permettent de communiquer avec plusieurs dépots lors des ```git pull``` et ```git push```
- "git stash" qui permet de mettre de coté des modifications momentanément
- les "pull-requests", qui permettent d'avoir plusieurs dépots
principaux, et d'échanger des modifications entre eux. (Ceci est un
mécanisme propre à github)