Update Git et Gitlab authored by David Rouquet's avatar David Rouquet
[Git](https://git-scm.com/) est un outil de gestion de versions, il permet de travailler à plusieurs sur du code en gardant un historique cohérent.
## Plan
[[_TOC_]]
## Configurer git bash et spyder
Opérations à faire une fois sur chaque poste :
1. Ouvrir notepad, copier coller les lignes ci-dessous **en changeant le nom et l'email** et sauver dans un fichier `C:\User\<user>\.gitconfig` (remplacer `<user>` par votre nom d'utilisateur)
```
[user]
name = Jane Doe
email = Jane.Doe@example.com
[merge]
tool = winmerge
[mergetool "winmerge"]
cmd = "'C:/Program Files (x86)/WinMerge/WinMergeU.exe'" -e -u -wl -dl "Local" -dm "$MERGED" -wr -dr "Distant" "$LOCAL" "$MERGED" "$REMOTE"
[mergetool]
prompt = false
[diff]
tool = winmergediff
[difftool "winmergediff"]
cmd = "'C:/Program Files (x86)/WinMerge/WinMergeU.exe'" -e -u -wr -dr "Reference" "$MERGED" "$LOCAL"
[difftool]
prompt = false
[guitool "Mergetool"]
cmd = git mergetool
[guitool "Difftool"]
cmd = git difftool
keepBackup = false
keepTemporaries = false
[guitool "Pull"]
cmd = git pull $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD) | tr / \" \")
[gui]
recentrepo = C:/Users/User/SAGE git/david
```
2. Télécharger et installer [winmerge](https://sourceforge.net/projects/winmerge/files/stable/2.16.8/WinMerge-2.16.8-Setup.exe)
3. Générer une clef ssh permettant de vous authentifier sans mot de passe :
1. Lancer git-gui (click droit dans un dossier et "git gui here")
![image](uploads/0d7aa482cd16ee0427fafec7289fb2ae/image.png)
2. Menu > Help > Show SSH Key
![image](uploads/59742e78178f9c72507439cdd3697492/image.png)
3. Generate Key
![image](uploads/ff96242ab3020274b6b0739cea22a935/image.png)
4. Au prompt faire OK sans entrer de mot de passe (2 fois)
5. Selectionner le text et cliquer sur "Copy to clipboard"
![image](uploads/8d1bc864cd99af7d3ca005549ef045a2/image.png)
6. Aller sur Gitlab dans ses réglages
![image](uploads/2372ebacd3dfd38adb7c4ee0e2af1667/image.png)
7. Aller sur les clef ssh et coller le texte et cliquer sur add key
![image](uploads/28de8cf4dbcbdca06614b47b641d906c/image.png)
4. Dans le(s) environnement(s) de Spyper faire `conda install git`
## Utiliser git avec spyder
### Cloner un dépot
Impossible depuis spyder **(à vérifier)**.
1. Aller dans le dossier avec l'explorateur windows, faire click droit et "git gui here":100:
![image](uploads/a44396eab592aa6e3a3290685f68fd26/image.png)
2. Choisir clone Existing repository
![image](uploads/0cb215bff9ad113c75fd4476fb2a7427/image.png)
3. Indiquer l'url de clone et le projet de référence et cliquer Clone
![image](uploads/a120398b07a9398477dbc4567e278489/image.png)
4. Entrer le mot de passe de la clé ssh puis ok et encore 'yes' et Ok au prompt suivant
### Ouvrir le projet git depuis Spyder
1. Aller dans Projects > New Project
![image](uploads/b8af976ef31ee74615a2bf5db47cdf17/image.png)
2. Choisir "Existing directory" et selectionner le projet cloné précédement
![image](uploads/bc71a5d995f90a4339aa6e3fd6844fb1/image.png)
3. Dans le menu de gauche vous devez voir voir votre projet.
### Workflow
Pour utiliser git depuis spyder vous avez 2 possibilité, nous recommandons d'utiliser l'interface graphique , pour ce faire, faire un click droit sur le projet et :
+ Commit pour ouvrir [Git gui](#git-gui) l'interface graphique principale
+ Browse repository pour ouvrir (Gitk)[#gitk] l'interface graphique de visualisation de l'état du dépôt
![image](uploads/7ef67a16dfb5c7c173e6a1a38678eac7/image.png)
Vous pouvez aussi lancer des commandes git depuis la commande ipython en tapant `!git macomamnde`
### Git gui
![image](uploads/f5bd0cf25bd2e17ee4b4aa0c76d6ed9a/image.png)
1. Récupérer les changement (pull)
![image](uploads/bfc35c55aa2ad2ee674a1fcc0356007b/image.png)
2. Sauver ses modifications (commit + push)
1. Marquer les changements pour le commit
![image](uploads/576fca758a64e399b671590c4d3ea464/image.png)
2. Ecrire un message explicatif et cliquer commit
![image](uploads/acc84932c4af265c89ea6b2dae6612eb/image.png)
3. Envoyer les données sur le serveur (push)
![image](uploads/2e2f40c7d52e607db59902edfac7c3bb/image.png)
4. Si le push à réussit vous devez voir un success, sinon c'est probablement que vous devez faire un pull (voir 1.)
![image](uploads/58e1cbdd093f55e1488c00a05b55ddcd/image.png)
3. Visualiser l'historique : depuis le menu Repository > visualize Master history ou visualiza all branches history, il est possible d'ouvrir l'interface de visualisation de l'historique ([gitk](#gitk))
### Fusion à 3 fichiers
Si une collègue à effectuée des changements avant vous, le ppush sera refusé par gitlab indiquant `non fast-forward`. Il faut alors faire un `Pull` qui pourra résulter à deux situations :
1. Si vous avez modifié des fichiers différents ou des parties différentes d'un même fichier, alors git fera une fusion `fast-forward` c'est à dire qu'il prendra les deux série de changements
2. Sinon git pull indiquera une erreur :
![image](uploads/52481e7a3a3f569b5ee4acc976409b94/image.png)
il faudra que vous fassiez une fusion à 3 fichiers, c'est à dire une fusion entre :
+ Votre version
+ Celle de votre collègue
+ La version partiellement fusionnée par git
Pour ce faire, lancer git-gui et aller dans Tool > Merge
![image](uploads/2ef2db90c54d13391b749503de4d7cbf/image.png)
cela lancera winmerge :
![image](uploads/2cbaf4e5abb5e484a55836b0174a97b4/image.png)
Faites vos modifications dans le panneau du milieu et enregistrez puis faite un commit et un push normalement
Enfin supprimez les fichiers temporaires de fusion :
![image](uploads/c47d7e2a574ddd41efac980ad34c5164/image.png)
### gitk
Gitk permet de facilement voir "où on en est" par rapport au serveur gitlab, exemple:
![image](uploads/2272931a6265ca7aee38f8cfdcd9e0ab/image.png)
![image](uploads/61f1602cbd53ff49a25ed36582282e98/image.png)
## Avancé
### Resources supplémentaires
+ [une feuille aide mémoire produite par gitlab](https://about.gitlab.com/images/press/git-cheat-sheet.pdf)
+ [Tutoriel gitlab it's all connected](https://about.gitlab.com/blog/2016/03/08/gitlab-tutorial-its-all-connected/)
### Git en ligne de commande
1. Récupérer les modifications des collègues `git pull`
2. Éditer des fichiers
3. Ajouter des nouveaux fichiers (dire à git de les gérer) `git add <fichiers>`
4. Enregistrer les modifications `git commit <fichiers>` ou `git commit -a` pour enregistrer toutes les modifications
5. Envoyer les modifications sur le serveur `git push`
### Récupérer un fichier
Pour revenir à la dernière version d'un fichier:
`git checkout <monfichier>`
### Les branches
Les branches permettent d'avoir deux version du code différentes qui coexistent, elles sont très utiles pour :
+ Garder des version stables indépendamment du développement
+ Permettre à quelqu'un de faire un travail de fond sur le code sans déranger les autres
#### En graphique
1. Voir sur quel branche on est
![image](uploads/a75bbc67d45bf890d74401a8af7d44d0/image.png)
2. Créer une nouvelle branche
![image](uploads/55b1dff02d3c18f526dc8b743d21da9b/image.png)
![image](uploads/6d6abd588db1a5d6020765eb93525de3/image.png)
3. Faire une demande de fusion via gitlab
![image](uploads/363f2a867fee6f77c30a8cff81a2b0fa/image.png)
![image](uploads/1bebbf3f025e38107502c77b160ee4d1/image.png)
4. Faire une review de code sur gitlab
![image](uploads/1b3d66a104037e5da8a299470db2d1d9/image.png)
![image](uploads/c6b7ecfccf4404d3b1ce5f3ebdaafb38/image.png)
Avant d'accepter aller sur `changes` et relire le code, au besoin on peut cliquer à gauche à côté du code pour écrire un message / demander des changements :
![image](uploads/4c5319a9dcd1f88728e60dbf67150f73/image.png)
5. Fusionner une branche
#### En ligne de commande
1. Créer une branche `git checkout -b maBranche`
2. Changer de branche `git switch` (penser à committer ou [stasher](#l-etagere) vos modifications avant
#### Conventions
Si vous appelez vos branche `n-ma-branche` (au lieu de `ma-branche`) ou `n` est un numéro d'issue gitlab, alors ce dernier reconnaîtra que votre branche est liée à l'issue `n` et mettra un lien dans le fil de discussion de l'issue
### L'étagère
Parfois il est nécessaire d'enregistrer des modifications et de les mettre de côté pour les reprendre plus tard, pour cela il est possible de faire `git stash` toutes vos modifications sont alors empilées sur une "étagère", vous pouvez changer de branche et quand vous voulez les récupèrer : `git stash pop`
### Schéma du fonctionnement des commandes principales
```mermaid
graph LR
subgraph local
W
S
L
end
W(Espace de travail) -->|git add| S(Staging)
S -->|git commit| L[(Dépot Local)]
W -->|git commit -a| L
L -->|git push| R[(Dépot distant)]
R -->|git fetch| L
L -->|git merge| W
R -->|git pull| W
```
\ No newline at end of file