---
tags: dojo
---
# WorkShop GIT avancé
## Branches
* J’ai créé une branche dans mon dépôt et j’aimerais pousser mes modifications sur le serveur, comment dois-je procéder.
* La nouvelle branche: `git checkout -b feature_branch_name`
* Édition, ajout et commit de fichiers...
* Push de la nouvelle branche: `git push -u origin feature_branch_name`
* J'ai forké un repo Github et le repo père a été mis à jour, comment puis-je récupérer les modifications dans mon fork ?
* [Github sync a fork](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/syncing-a-fork)
* J’ai créé une branche A dans mon dépôt et entre temps, plusieurs fichiers ont été modifiés sur la branche master. Comment puis-je:
```
A---B---C (A)
/
D---E---F---G (master)
```
* récupérer toutes les modifications de master dans la branche A
* Option "merge"
```bash
git checkout A
git fetch --all
git merge master
```
```mermaid
gitGraph:
checkout master
commit
commit
checkout A <- WIP a terminé
```
* Option "rebase"
```bash
git checkout A
git rebase master
(ou, depuis master, git rebase master A)
```
Note: les deux options ont un résultat différent, dans le sens qu'avec l'option "merge", la fin des opérations termine sur la branche A alors qu'avec l'option "rebase" on se trouve sur la branche master !
* récupérer un seul fichier (i.e. git-cherry-pick)
`git checkout <branch_name> -- <paths>`
→ http://nicolasgallagher.com/git-checkout-specific-files-from-another-branch/
```mermaid
graph TD
C0 --> C1
C1 --> C2
C1 --> C4
C4 --> C5
C5 --> C6
C2 --> C3
```
```mermaid
graph TD
C0 --> C1
C1 --> C2
C1 --> C4
C4 --> C5
C5 --> C6
C2 --> C3
C3 --> C7
C6 --> C7
```
```mermaid
gitGraph:
options
{
"nodeSpacing": 150,
"nodeRadius": 10,
}
end
commit
branch newbranch
checkout newbranch
commit
commit
checkout master
commit
commit
merge newbranch
```
## Checkout
J’ai besoin de restaurer une version d’un commit précédent. le message de log n’étant pas suffisant, comment puis-je procéder ?
```bash
git log
git checkout “hash”
git checkout master
```
## Commit
J’ai fait une erreur lors d’un commit et ai refait plusieurs commit depuis. Comment puis-je la corriger en conservant tout l’historique?
## Stash
Je suis en train de faire des essais dans mon répertoire et suite à une demande urgente j’aimerais récupérer la copie “clean” de ce dernier afin de pouvoir faire les changement importants sans pour autant perdre ou devoir commiter mes essais en cours, est-ce possible et comment ?
## Patch
J’ai un accès en lecture seule sur un dépôt sans possibilité de créer une pull request, comment puis générer un patch de mes modification à l’auteur de dépôts et comment peut-il les intégrer à son code ?
## Rebase
J’ai fait des commit à la va-vite et j’aimerais nettoyer le git log pour le rendre plus lisible et pouvoir récupérer plus facilement chaque changement. Comment puis modifier des commits antérieurs ?
## Worktree
Lorsque je bosse sur un dev … pas prêt à faire un commit et qu’un bug en production m’oblige à sauter dans une autre branche pour faire un commit fix.
## Git Hooks
Qu’est-ce qu’un “hooks” et comment peut-on les utiliser ? (TBD)
## Sparse checkout
git sparse-checkout a été introduit dans Git 2.5 et permet de faire des checkouts partiels.
## Staging
## Reset
## Merge (git flow)
http://nvie.com/posts/a-successful-git-branching-model/
ou
http://danielkummer.github.io/git-flow-cheatsheet/
## Submodules
## Rerere
## Comment purger un gros dépôt tout en gardant son historique ?
Au fil du temps, après 200 commits par exemple, un dépôt git (plusieurs dizaines de dossier et fichiers) peut prendre beaucoup de place !
Comment faire pour le 'purger' sélectivement ?
Comment rechercher dans les commits où se trouve le coupable ?
Et comment l'effacer sans perdre toute l'histoire ?
Bref, une gestion de son git un peu plus pro que les simples utilisations de tous les jours 😉