diff --git a/git_tutorial.md b/git_tutorial.md index 6a76d3799b711474613af1cec5fa6e450bbfe413..dc9ad6868731a89186941f3e4623c503577d4567 100644 --- a/git_tutorial.md +++ b/git_tutorial.md @@ -5,18 +5,18 @@ # Qu'est-ce que Git? - Git est un outil de gestion de versions (dév. par L. Torvalds). - * Cela évite d'avoir à gérer les fichiers d'un projet comme: - - fichier.c - - fichier_10_3_2020.c - - fichier_10_3_2020_16h.c - - fichier_10_3_2020_16h_Malaspinas.c - - fichier_10_3_2020_16h_Albuquerque.c - * L'historique est accessible à tout moment. - * Difficile d'écraser le mauvais fichier lors d'une synchronisation. + - Cela évite d'avoir à gérer les fichiers d'un projet comme: + - fichier.c + - fichier_10_3_2020.c + - fichier_10_3_2020_16h.c + - fichier_10_3_2020_16h_Malaspinas.c + - fichier_10_3_2020_16h_Albuquerque.c + - L'historique est accessible à tout moment. + - Difficile d'écraser le mauvais fichier lors d'une synchronisation. - Possibilité de découpler le développement dans un projet. - * Fusionne les modifications non-conflictuelles automatiquement. - * Un projet peut avoir différentes *branches* de développement (on peut développer une nouvelle version et faire des corrections de bug en parallèle). -- **Permet le travail de plusieurs développeurs sur le même projet!** + - Fusionne les modifications non-conflictuelles automatiquement. + - Un projet peut avoir différentes *branches* de développement (on peut développer une nouvelle version et faire des corrections de bug en parallèle). +- **Permet le travail de plusieurs développeurs sur le même projet!** # Principe de fonctionnement de Git (1/3) @@ -29,9 +29,9 @@ Mais, typiquement un projet git possède un serveur "officiel" (centralisé): - Un·e développeur·euse peut faire une copie (clone) de tout le projet (sur son ordinateur). - Modifier localement le projet et publier (push) ses propres modifications (sur son ordinateur). - Demander au gestionnaire du projet de fusionner (merge) ses modifications avec le serveur "officiel" (pull/merge request): - - L'administrateur récupère le projet depuis le serveur du développeur. - - Fusionne le projet officiel avec celui modifié (merge). - - Publie les modifications sur le serveur officiel (push). + - L'administrateur récupère le projet depuis le serveur du développeur. + - Fusionne le projet officiel avec celui modifié (merge). + - Publie les modifications sur le serveur officiel (push). # Principe de fonctionnement de Git (2/3) @@ -43,14 +43,14 @@ Mais, typiquement un projet git possède un serveur "officiel" (centralisé): # A hepia -* <https://gitedu.hesge.ch>, instance de `gitlab`. -* **Attention:** `gitlab` ou `github` ce n'est pas `git`. -* Connection aux repos via `https` (identifiants à rentrer à chaque fois), -* ou via `ssh` (la vie est quand même plus simple). -* Configurons ça ensemble: - * `ssh-keygen` (mettre un mot de passe si vous voulez) - * copier le contenu de `~/.ssh/id_rsa.pub` dans `preferences->ssh keys` - * cliquer sur `Add key` +- <https://gitedu.hesge.ch>, instance de `gitlab`. +- **Attention:** `gitlab` ou `github` ce n'est pas `git`. +- Connection aux repos via `https` (identifiants à rentrer à chaque fois), +- ou via `ssh` (la vie est quand même plus simple). +- Configurons ça ensemble: + - `ssh-keygen` (mettre un mot de passe si vous voulez) + - copier le contenu de `~/.ssh/id_rsa.pub` dans `preferences->ssh keys` + - cliquer sur `Add key` # Exemple de fonctionnement @@ -77,6 +77,7 @@ $ cd tutorial 2. Ajout du `premierfichier.c` aux fichiers suivis par git. 3. *Commit* du fichier ajouté à l'historique des modifications. 4. *Push* de l'état de l'historique sur le serveur. + ```bash [tutorial]$ echo Hello World > premierfichier.c [tutorial]$ git status @@ -87,7 +88,7 @@ No commits yet Untracked files: (use "git add <file>..." to include in what will be committed) - premierfichier.c + premierfichier.c nothing added to commit but untracked files present (use "git add" to track) @@ -107,7 +108,7 @@ No commits yet Changes to be committed: (use "git rm --cached <file>..." to unstage) - new file: premierfichier.c + new file: premierfichier.c [tutorial]$ git commit -m "mon premier commit" [master (root-commit) a4f2052] mon premier commit @@ -138,14 +139,12 @@ To ssh://ssh.hesge.ch:10572/orestis.malaspin/tutorial.git ## Recommandations - -* Faire des *commits* réguliers (ne pas attendre d'avoir un projet qui fonctionne complètement). -* Mettre des messages de *commit* qui font du sens. -* Éviter d'ajouter de fichiers binaires (prennent de la place). - * Les fichiers binaires sont générables par l'utilisateur du projet. -* Éviter de faire `git add .` -* Utiliser les fichiers `.gitignore` pour se protéger. - +- Faire des *commits* réguliers (ne pas attendre d'avoir un projet qui fonctionne complètement). +- Mettre des messages de *commit* qui font du sens. +- Éviter d'ajouter de fichiers binaires (prennent de la place). + - Les fichiers binaires sont générables par l'utilisateur du projet. +- Éviter de faire `git add .` +- Utiliser les fichiers `.gitignore` pour se protéger. # Modification de fichiers dans l'historique (1/3) @@ -164,7 +163,7 @@ Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) - modified: premierfichier.c + modified: premierfichier.c no changes added to commit (use "git add" and/or "git commit -a") ``` @@ -230,7 +229,7 @@ Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) - modified: premierfichier.c + modified: premierfichier.c no changes added to commit (use "git add" and/or "git commit -a") ``` @@ -267,10 +266,10 @@ Your branch is up to date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) - modified: premierfichier.c + modified: premierfichier.c [tutorial]$ git reset HEAD Unstaged changes after reset: -M premierfichier.c +M premierfichier.c ``` # Revenir en arrière dans l'historique (4/6) @@ -288,7 +287,7 @@ Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) - modified: premierfichier.c + modified: premierfichier.c no changes added to commit (use "git add" and/or "git commit -a") [tutorial]$ git diff @@ -319,7 +318,7 @@ Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded. (use "git pull" to update your local branch) Changes not staged for commit: - modified: premierfichier.c + modified: premierfichier.c no changes added to commit [tutorial]$ git checkout premierfichier.c @@ -353,12 +352,12 @@ Automatic merge failed; fix conflicts and then commit the result. # Un `git push` par erreur -* Un `git push` est très difficile à "effacer". -* Cela revient à *réécrire* l'historique de votre projet. - * Cela est *dangereux*, surtout quand on travail à plusieurs. -* Le plus simple est de revenir à une version antérieure et faire un nouveau +- Un `git push` est très difficile à "effacer". +- Cela revient à *réécrire* l'historique de votre projet. + - Cela est *dangereux*, surtout quand on travail à plusieurs. +- Le plus simple est de revenir à une version antérieure et faire un nouveau commit. -* Il existe des techniques *violentes* qu'on verra pas ici. +- Il existe des techniques *violentes* qu'on verra pas ici. # Retirer un fichier du contrôle de version (1/3) @@ -377,7 +376,7 @@ Your branch is up to date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) - deleted: premierfichier.c + deleted: premierfichier.c [orestis@perka tutorial]$ git commit -am "efface donc ce fichier" [master 8f76d90] efface donc ce fichier 1 file changed, 1 deletion(-) @@ -393,7 +392,7 @@ Changes to be committed: total 0 [orestis@perka tutorial]$ git reset bbb151324289dc2f85468f5721ec1021692dd216 Unstaged changes after reset: -D premierfichier.c +D premierfichier.c [orestis@perka tutorial]$ git status On branch master Your branch is up to date with 'origin/master'. @@ -402,7 +401,7 @@ Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) - deleted: premierfichier.c + deleted: premierfichier.c no changes added to commit (use "git add" and/or "git commit -a") ``` @@ -447,28 +446,28 @@ Git voit les fichiers dans trois états possibles: ## Certains fichiers ne doivent pas être *addables* -* Ils doivent *explicitement* être ignorés. +- Ils doivent *explicitement* être ignorés. # Quels fichiers ignorer On ignore typiquement: -* Les fichiers binaires: exécutables, images, ... -* Les produits de compilation: `*.o`, `*.pyc`, ... -* Les produits d'exécutions: logs, ... -* Les fichiers de configuration d'un IDE: .vscode, ... -* Les fichiers système. +- Les fichiers binaires: exécutables, images, ... +- Les produits de compilation: `*.o`, `*.pyc`, ... +- Les produits d'exécutions: logs, ... +- Les fichiers de configuration d'un IDE: .vscode, ... +- Les fichiers système. # Comment ignorer des fichiers? -* Créer un fichier texte nommé `.gitignore`. -* L'ajouter au répo git et le "commit". -* Y ajouter les règles à suivre pour ignorer les fichiers. +- Créer un fichier texte nommé `.gitignore`. +- L'ajouter au répo git et le "commit". +- Y ajouter les règles à suivre pour ignorer les fichiers. Exemple: [^2] -```bash -biden # ignore le fichier biden +```console +harris # ignore le fichier harris *.o # ignore tous les fichier `.o` !trump.o # mais PAS trump.o sanders # ignore le répertoire sanders @@ -477,6 +476,18 @@ sanders # ignore le répertoire sanders [^2]: Pour une liste plus exhaustive voir le site <https://bit.ly/2HTZJyQ> par exemple. +# Un exemple de fichier `.gitignore` + +```console +# Ignore everything +* +# Except .gitignore, Makefile, *.c, *.h +!.gitignore +!*.c +!*.h +!Makefile +``` + # Des références Il existe énormément de très bons documents et tutoriels en ligne: @@ -498,4 +509,3 @@ Et des GUI assez utiles: # Des questions? {width=70%} -