---
# System prepended metadata

title: WorkShop GIT avancé
tags: [dojo]

---

---
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 😉

