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