# Introduction à Git
### Présentation
`git` est un outil de versionnage de code qui permet de :
- **Conserver** son code en ligne
- **Tracer** l'historique des différents modules
- **Partager** le code entre plusieurs membres d'une équipe

`git` correspond au nom de la suite de commandes et du langage de version. Plusieurs sites fournissent des services pour héberger le code et permettre d'y accéder plus facilement (github.com, gitlab.com, ...) et plusieurs outils de développement font le lien direct avec ces sites là (c'est notamment le cas de tous les outils de JetBrains dont PyCharm fait partie).
### Fonctionnement
`git` fonctionne sur une base de **versions** du code appelés **`commit`**. Chaque **`commit`** présente l'état du projet et des fichiers sources à un instant donné. La version locale de ces fichiers peut ensuite être mise en ligne et hébergée.

### Commandes principales

- **`git add`**: Ajout des fichiers donnés à la liste des fichiers qui seront versionnés au prochain **`commit`**.
- **`git commit`**: Création d'une nouvelle version du projet à partir des fichiers ajoutés.
- **`git push`**: Propagation des changements locaux vers la version hébergée en ligne.
- **`git pull`**: Mise à jour des fichiers locaux à partir de ceux en ligne.
### Recommandations
Les recommandations principales lors de l'utilisation d'un projet `git` sont les suivantes.
- TOUJOURS mettre à jour son projet avec la version en ligne avant d'écrire du code !
- PLUSIEURS `commits` réguliers vous permettront de mieux tracer vos changements plutôt qu'un seul !
- Essayez de travailler sur des morceaux de code différents pour ne pas modifier en même temps la même partie.
-
## Installation
### Création d'un projet avec PyCharm
- Créez un nouveau projet avec `File` > `New Project`, une fenêtre d'ouvre et vous demande le chemin souhaité pour votre projet.
- Créez un dossier `git` avec `VCS` (Version Control Service) > `Create Git Repository...`, une fenêtre s'ouvre pour spécifier le chemin du projet. Sélectionnez le chemin du nouveau projet.
- L'onglet `VCS` s'appelle maintenant `Git`
***Votre projet Python est prêt à accueillir Git !***
---
### Création d'un projet sur Gitlab/Github
#### Gitlab ENSTA
- Connectez-vous à votre compte [Gitlab ENSTA](https://gitlab.ensta-bretagne.fr) (mêmes identifiants que Moodle).
- Créez un projet en utilisant `New Project`. Renseignez le même nom que votre projet PyCharm.
#### Github
- Créez un compte [Github](https://github.com).
- Cliquez sur `New Repository`. Renseignez le même nom que votre projet PyCharm.
***Votre projet Git est prêt à être utilisé !***
---
### Lien entre projet PyCharm et projet Git
- Sur PyCharm, sélectionnez `Git` > `Manage Remotes...`.
- Cliquez sur le `+`. Dans la case `URL`, renseignez le lien de votre projet, par exemple : `https://gitlab.ensta-bretagne.fr/ducassqu/python-project`
- Renseignez vos identifiants (Github ou Gitlab en fonction de la méthode choisie).
***Votre projet Python est relié entre Git et PyCharm !***
---
### Commit, Push et Pull
- Dans PyCharm, pour créer une nouvelle version des fichiers source, cliquez sur `Git` > `Commit...`.
- Sélectionnez les fichiers à rajouter, renseignez un message pour la version et cliquez sur `Commit`.

***Votre code a été mis à jour LOCALEMENT !***
- Pour mettre à jour votre code en ligne, il faut `push`. La commande est disponible via `Git` > `Push`.
***Votre code est mis à jour EN LIGNE à partir de votre version locale !***
- Pour mettre à jour localement votre code à partir de votre projet en ligne il faut `pull`. La commande basique est disponible via `Git` > `Update Project...`.
***Votre code local a été mis à jour à partir de la version en ligne !***
---
### Configuration du projet pour la collaboration
Pour collaborer effectivement, il faut donner accès à votre projet à votre binôme. La méthode pour donner accès est la suivante :
- #### Gitlab
- Passer le projet en `Public` : `Settings` > `General` > `Visibility` et la passer de `Private` à `Public`.
- Ajouter votre binôme en `Members` en temps que `Maintainer` 
- #### Github
- Ajouter votre binôme dans `Settings` > `Manage Access` 
***Vous pouvez maintenant tou.te.s les deux avoir accès à toutes les fonctionnalités du projet !***
---
### Structure du projet Python
La structure de votre projet Python pourra reprendre la suivante :
- python-project
- .gitignore
- README.md
- python-project
- src1.py
- src2.py
- tests
- test_src1.py
- test_src2.py
- docs
- sujet.pdf
Avec :
- le fichier `README.md` qui décrit votre projet (`.md` correspondant à [Markdown](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet)).
- le fichier `.gitignore` qui contient le nom de TOUS les fichiers qui doivent être **IGNORÉS** par `git`. Vous pouvez copier-coller le `.gitignore` suivant :
```markdown
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
# OS generated files
.DS_Store
.DS_Store?
._*
.*.sw[op]
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
```
###### tags: `git`