Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
git:gitminimal [2018/11/06 16:29] – modification externe 127.0.0.1git:gitminimal [2023/09/20 18:52] (Version actuelle) – modification externe 127.0.0.1
Ligne 33: Ligne 33:
 Le contrôle d'accès aux entrepôt est réalisé avec les clés publiques des utilisateurs. Si ce n'est pas déjà fait, chaque utilisateur doit donc créer une paire de clés avec la commande ''ssh-keygen''.Il est conseillé de laisser la réponse par défaut à la première question (les clés seront réalisées en utilisant rsa, stockée dans ''~/.ssh'', la clé publique sera ''id_rsa.pub'' et la clé privée ''id_rsa''), la passphrase est utilisée pour sécurisé la clé privée. Le contrôle d'accès aux entrepôt est réalisé avec les clés publiques des utilisateurs. Si ce n'est pas déjà fait, chaque utilisateur doit donc créer une paire de clés avec la commande ''ssh-keygen''.Il est conseillé de laisser la réponse par défaut à la première question (les clés seront réalisées en utilisant rsa, stockée dans ''~/.ssh'', la clé publique sera ''id_rsa.pub'' et la clé privée ''id_rsa''), la passphrase est utilisée pour sécurisé la clé privée.
  
-<cli>+<konsole> 
 +<nowiki>
 test@pc-bruno ~$ ssh-keygen  test@pc-bruno ~$ ssh-keygen 
 Generating public/private rsa key pair. Generating public/private rsa key pair.
Ligne 55: Ligne 56:
 |      ..E +      | |      ..E +      |
 +-----------------+ +-----------------+
-</cli>+</nowiki> 
 +</konsole>
  
 Si vous disposez d'un système de gestion des entrepôts (github, redmine, ...) votre clé **publique** peut maintenant être utilisée pour vous authentifier. Par exemple en l'ajoutant profil utilisateur. Si vous disposez d'un système de gestion des entrepôts (github, redmine, ...) votre clé **publique** peut maintenant être utilisée pour vous authentifier. Par exemple en l'ajoutant profil utilisateur.
Ligne 64: Ligne 66:
 Git a besoin au minimum de connaitre le nom et l'email à associer aux commit. Pour cela, exécutez les commandes suivantes (sur chaque machine utilisée) en changeant vos noms et email. La troisième commande définit le comportement par défaut du push. Git a besoin au minimum de connaitre le nom et l'email à associer aux commit. Pour cela, exécutez les commandes suivantes (sur chaque machine utilisée) en changeant vos noms et email. La troisième commande définit le comportement par défaut du push.
  
-<cli>+<konsole> 
 +<nowiki>
 test@pc-bruno $ git config --global user.name    "John Doe" test@pc-bruno $ git config --global user.name    "John Doe"
 test@pc-bruno $ git config --global user.email   "john.doe@example.com" test@pc-bruno $ git config --global user.email   "john.doe@example.com"
 test@pc-bruno $ git config --global push.default simple test@pc-bruno $ git config --global push.default simple
-</cli>+</nowiki> 
 +</konsole>
  
 ===== Utilisation de base ===== ===== Utilisation de base =====
Ligne 75: Ligne 79:
  
 Pour créer un entrepôt, on utilise la commande ''git init'' : Pour créer un entrepôt, on utilise la commande ''git init'' :
-<cli>+<konsole> 
 +<nowiki>
 test@pc-bruno ~$ mkdir monProjet test@pc-bruno ~$ mkdir monProjet
 test@pc-bruno ~$ cd monProjet/ test@pc-bruno ~$ cd monProjet/
 test@pc-bruno monProjet$ git init test@pc-bruno monProjet$ git init
 Dépôt Git vide initialisé dans /home/test/monProjet/.git/ Dépôt Git vide initialisé dans /home/test/monProjet/.git/
-</cli>+</nowiki> 
 +</konsole>
  
 Ici nous avons créé un répertoire vide mais il peut s'agit d'un répertoire déjà existant même si il a déjà du contenu. Ici nous avons créé un répertoire vide mais il peut s'agit d'un répertoire déjà existant même si il a déjà du contenu.
Ligne 86: Ligne 92:
 Pour cloner un repository existant (dont on connait l'adresse) on utilise la commande ''git clone''. Pour cloner un repository existant (dont on connait l'adresse) on utilise la commande ''git clone''.
  
-Par exemple, le projet sandbox des M1 de 2016 sur github ([[https://github.com/dptinfoutln/sandboxm1]]) possède un dépôt Git. La page d'accueil du projet indique l'adresse de l'entrepôt (dans le bouton clone)([[git@github.com:dptinfoutln/sandboxm1.git]])+Par exemple, ce projet github ([[https://github.com/dptinfoutln/m120192020_helloworld]]) possède un dépôt Git. La page d'accueil du projet indique l'adresse de l'entrepôt (dans le bouton clone) 
 +  * en ssh pour un projet privé si votre clé à été ajoutée [[git@github.com:dptinfoutln/m120192020_helloworld.git]].  
 +  * en http sinon [[https://github.com/dptinfoutln/m120192020_helloworld.git]] 
 + 
 +<note important>Créer un compte github avec votre vrai nom, activer l'offre étudiant pour avoir des entrepôts privé et poster votre identifiant sur slack pour être ajouté à l'équipe du M1.</note>
  
 Pour le cloner : Pour le cloner :
-<cli+<konsole> 
-/tmp ❯❯❯ git clone git@github.com:dptinfoutln/sandboxm1.git+<nowiki
 +/tmp ❯❯❯ git clone git@github.com:dptinfoutln/m120192020_helloworld.git
 Clonage dans 'sandboxm1'... Clonage dans 'sandboxm1'...
 remote: Counting objects: 17, done. remote: Counting objects: 17, done.
Ligne 98: Ligne 109:
 Vérification de la connectivité... fait. Vérification de la connectivité... fait.
 /tmp ❯❯❯ cd sandboxm1 /tmp ❯❯❯ cd sandboxm1
-</cli>+</nowiki> 
 +</konsole>
  
 le répertoire ''sandboxm1'' contient maintenant une copie de l'entrepôt. le répertoire ''sandboxm1'' contient maintenant une copie de l'entrepôt.
Ligne 117: Ligne 129:
  
 Quand un entrepôt est créé avec la commande ''clone'', un lien vers l'entrepôt d'origine est conservé. Pour obtenir la liste des entrepôts distants associés à un entrepôt on utilise la commande ''git remote''. Quand un entrepôt est créé avec la commande ''clone'', un lien vers l'entrepôt d'origine est conservé. Pour obtenir la liste des entrepôts distants associés à un entrepôt on utilise la commande ''git remote''.
-<cli>+<konsole> 
 +<nowiki>
 /t/sandboxm1 ❯❯❯ git remote -v                                                                    master /t/sandboxm1 ❯❯❯ git remote -v                                                                    master
 origin git@github.com:dptinfoutln/sandboxm1.git (fetch) origin git@github.com:dptinfoutln/sandboxm1.git (fetch)
 origin git@github.com:dptinfoutln/sandboxm1.git (push) origin git@github.com:dptinfoutln/sandboxm1.git (push)
-</cli>+</nowiki> 
 +</konsole>
  
 ==== Commandes courantes ==== ==== Commandes courantes ====
Ligne 132: Ligne 146:
 L'exemple suivant illustre une utilisation classique : l'utilisateur test va créer un fichier ''test.txt'' (''echo''), le placer sous la surveillance de l'entrepôt (''add''), valider l'ajout (''commit'')).  Notez le détail des réponses de ''git status''. L'exemple suivant illustre une utilisation classique : l'utilisateur test va créer un fichier ''test.txt'' (''echo''), le placer sous la surveillance de l'entrepôt (''add''), valider l'ajout (''commit'')).  Notez le détail des réponses de ''git status''.
  
-<cli>+<konsole> 
 +<nowiki>
 test@pc-bruno sandboxgit$ git status test@pc-bruno sandboxgit$ git status
 Sur la branche master Sur la branche master
Ligne 168: Ligne 183:
  
 rien à valider, la copie de travail est propre rien à valider, la copie de travail est propre
-</cli>+</nowiki> 
 +</konsole>
  
 A ce moment, les modifications sont validées mais locales. Il est possible de consulter le journal des modifications avec ''git log''. A ce moment, les modifications sont validées mais locales. Il est possible de consulter le journal des modifications avec ''git log''.
  
-<cli>+<konsole> 
 +<nowiki>
 test@pc-bruno sandboxgit$ git log test@pc-bruno sandboxgit$ git log
 commit af73a0bcec8c38076a86e6758cdb088ce520f485 commit af73a0bcec8c38076a86e6758cdb088ce520f485
Ligne 186: Ligne 203:
     dummy fixes #99 closes #99     dummy fixes #99 closes #99
 ... ...
-</cli+</nowiki> 
 +</konsole
  
 On peut vérifier ce qui a changé à distance (''git remote update'' puis ''git status'') : On peut vérifier ce qui a changé à distance (''git remote update'' puis ''git status'') :
-<cli>+<konsole> 
 +<nowiki>
 test@pc-bruno sandboxgit$ git remote update test@pc-bruno sandboxgit$ git remote update
 Récupération de origin Récupération de origin
Ligne 198: Ligne 217:
  
 rien à valider, la copie de travail est propre rien à valider, la copie de travail est propre
-</cli>+</nowiki> 
 +</konsole>
  
 Dans ce cas rien n'a changé, et l'on voit bien qu'il y a un commit à pousser. Dans ce cas rien n'a changé, et l'on voit bien qu'il y a un commit à pousser.
Ligne 204: Ligne 224:
 Nous allons maintenant modifier le fichier ''test.txt'' en ajoutant du texte (''echo''), accepter la modification (''add'') et la valider (''commit''). Ensuite, avant de pousser les modifications sur le serveur distant (''git push''),  nous allons vérifier si des changement sont intervenus et éventuellement mettre à jour la copie locale (''git pull''). Nous allons maintenant modifier le fichier ''test.txt'' en ajoutant du texte (''echo''), accepter la modification (''add'') et la valider (''commit''). Ensuite, avant de pousser les modifications sur le serveur distant (''git push''),  nous allons vérifier si des changement sont intervenus et éventuellement mettre à jour la copie locale (''git pull'').
  
-<cli>+<konsole> 
 +<nowiki>
 test@pc-bruno sandboxgit$ echo "encore du texte">>test.txt test@pc-bruno sandboxgit$ echo "encore du texte">>test.txt
 test@pc-bruno sandboxgit$ git add test.txt  test@pc-bruno sandboxgit$ git add test.txt 
Ligne 228: Ligne 249:
 To ssh://gitedu@lsis.univ-tln.fr/sandboxgit.git To ssh://gitedu@lsis.univ-tln.fr/sandboxgit.git
    4160dd6..53fa162  master -> master    4160dd6..53fa162  master -> master
-</cli>+</nowiki> 
 +</konsole>
  
 <WRAP center round tip 60%> <WRAP center round tip 60%>
Ligne 241: Ligne 263:
 ==== Quels fichiers versionner ? ==== ==== Quels fichiers versionner ? ====
 Tous les fichiers ne doivent pas être déposé sur le système de gestion de version. Tous les fichiers ne doivent pas être déposé sur le système de gestion de version.
-Les détails sont donnés ici : http://bruno.lsis.univ-tln.fr/git/gitignore+Les détails sont donnés ici : http://bruno.univ-tln.fr/git/gitignore
  
 <WRAP center round important 60%> <WRAP center round important 60%>
Ligne 249: Ligne 271:
 ==== Naviguer dans l'historique ==== ==== Naviguer dans l'historique ====
 Comme nous l'avons déjà vu ''git log'' permet de consulter le journal des modifications:  Comme nous l'avons déjà vu ''git log'' permet de consulter le journal des modifications: 
-<cli>+<konsole> 
 +<nowiki>
 test@pc-bruno sandboxgit$ git log test@pc-bruno sandboxgit$ git log
 commit 53fa162ffda184e6fdf9fdaa93fc60ae8b24d58a commit 53fa162ffda184e6fdf9fdaa93fc60ae8b24d58a
Ligne 268: Ligne 291:
     dummy fixes #99 closes #99     dummy fixes #99 closes #99
 ... ...
-</cli>+</nowiki> 
 +</konsole>
  
 Nous voyons qu'à chaque commit est associé un haché (SHA-1), par exemple 53fa162ffda184e6fdf9fdaa93fc60ae8b24d58a pour le dernier commit.  Nous voyons qu'à chaque commit est associé un haché (SHA-1), par exemple 53fa162ffda184e6fdf9fdaa93fc60ae8b24d58a pour le dernier commit. 
  
 Il est possible de voir ce qui s'est passé pour un commit donné : Il est possible de voir ce qui s'est passé pour un commit donné :
-<cli>+<konsole> 
 +<nowiki>
 test@pc-bruno sandboxgit$ git show 53fa162ffda184e6fdf9fdaa93fc60ae8b24d58a test@pc-bruno sandboxgit$ git show 53fa162ffda184e6fdf9fdaa93fc60ae8b24d58a
 commit 53fa162ffda184e6fdf9fdaa93fc60ae8b24d58a commit 53fa162ffda184e6fdf9fdaa93fc60ae8b24d58a
Ligne 288: Ligne 313:
  hello  hello
 +encore du texte +encore du texte
-</cli>+</nowiki> 
 +</konsole>
  
 A noter, qu'il est possible de n'utiliser qu'un préfixe du hash à condition qu'il soit non ambigu. Git est même capable de les calculer seul.  A noter, qu'il est possible de n'utiliser qu'un préfixe du hash à condition qu'il soit non ambigu. Git est même capable de les calculer seul. 
  
-<cli>+<konsole> 
 +<nowiki>
 test@pc-bruno sandboxgit$ git log --abbrev-commit --pretty=oneline test@pc-bruno sandboxgit$ git log --abbrev-commit --pretty=oneline
 53fa162 Ajout de précisions 53fa162 Ajout de précisions
 af73a0b Création d'un fichier texte à mon nom af73a0b Création d'un fichier texte à mon nom
 ... ...
-</cli>+</nowiki> 
 +</konsole>
  
 Il est aussi possible de voir ce qui a changé entre deux commit avec la commande ''git diff'' soit en indiquant deux commit entre lesquels faire la différence soit un seul (l'état courant sera alors utilisé) : Il est aussi possible de voir ce qui a changé entre deux commit avec la commande ''git diff'' soit en indiquant deux commit entre lesquels faire la différence soit un seul (l'état courant sera alors utilisé) :
-<cli>+<konsole> 
 +<nowiki>
 test@pc-bruno sandboxgit$ git diff af73a0b test@pc-bruno sandboxgit$ git diff af73a0b
 diff --git a/test.txt b/test.txt diff --git a/test.txt b/test.txt
Ligne 309: Ligne 338:
  hello  hello
 +encore du texte +encore du texte
-</cli>+</nowiki> 
 +</konsole>
  
 ==== Traitement de base des conflits ==== ==== Traitement de base des conflits ====
Ligne 318: Ligne 348:
  
 Les commandes suivantes permettent de créer un entrepôt ''monProjetCentral'' de type bare et deux clone "Projet1" et "Projet2". Les commandes suivantes permettent de créer un entrepôt ''monProjetCentral'' de type bare et deux clone "Projet1" et "Projet2".
-<cli>+<konsole> 
 +<nowiki>
 test@pc-bruno ~$ mkdir monProjetCentral && cd monProjetCentral && git --bare init test@pc-bruno ~$ mkdir monProjetCentral && cd monProjetCentral && git --bare init
 Dépôt Git vide initialisé dans /home/test/monProjetCentral/ Dépôt Git vide initialisé dans /home/test/monProjetCentral/
Ligne 334: Ligne 365:
 origin /home/test/monProjetCentral (fetch) origin /home/test/monProjetCentral (fetch)
 origin /home/test/monProjetCentral (push) origin /home/test/monProjetCentral (push)
-</cli>+</nowiki> 
 +</konsole>
  
 On notera qu'ici on a cloné un entrepôt local, il aurait pu être distant cela ne change rien. On notera aussi qu'il est possible de changer le nom du répertoire contenant le clone. Nous avons donc trois entrepôts : ''monProjetCentral'', ''monProjet1'' et ''monProjet2''. Le premier ne contient pas de copie de travail mais la base de données des changements. Les deux derniers sont des clones du premier (ils en gardent une référence), ils ont aussi chacun leur copie de travail. On notera qu'ici on a cloné un entrepôt local, il aurait pu être distant cela ne change rien. On notera aussi qu'il est possible de changer le nom du répertoire contenant le clone. Nous avons donc trois entrepôts : ''monProjetCentral'', ''monProjet1'' et ''monProjet2''. Le premier ne contient pas de copie de travail mais la base de données des changements. Les deux derniers sont des clones du premier (ils en gardent une référence), ils ont aussi chacun leur copie de travail.
  
 Nous allons maintenant ajouter un fichier README dans ''monProjet1'', le pousser dans l'entrepôt central. Nous allons maintenant ajouter un fichier README dans ''monProjet1'', le pousser dans l'entrepôt central.
-<cli>+<konsole> 
 +<nowiki>
 test@pc-bruno ~$ cd monProjet1/ test@pc-bruno ~$ cd monProjet1/
 test@pc-bruno monProjet1$ echo "Hello">README && git add README test@pc-bruno monProjet1$ echo "Hello">README && git add README
Ligne 352: Ligne 385:
 To /home/test/monProjetCentral To /home/test/monProjetCentral
  * [new branch]      master -> master  * [new branch]      master -> master
-</cli>+</nowiki> 
 +</konsole>
  
 et mettre à jour ''monProjet2''. et mettre à jour ''monProjet2''.
-<cli>+<konsole> 
 +<nowiki>
 test@pc-bruno monProjet1$ cd ../monProjet2/ test@pc-bruno monProjet1$ cd ../monProjet2/
 test@pc-bruno monProjet2$ git pull test@pc-bruno monProjet2$ git pull
Ligne 363: Ligne 398:
 Depuis /home/test/monProjetCentral Depuis /home/test/monProjetCentral
  * [nouvelle branche] master     -> origin/master  * [nouvelle branche] master     -> origin/master
-</cli>+</nowiki> 
 +</konsole>
  
 Habituellement, il y a un cycle de add/commit/pull/push depuis monProjet1 et monProjet2. Un problème va apparaître si l'un deux tente de pousser une modification sur fichier qui a déjà été modifié.  Habituellement, il y a un cycle de add/commit/pull/push depuis monProjet1 et monProjet2. Un problème va apparaître si l'un deux tente de pousser une modification sur fichier qui a déjà été modifié. 
  
 Par exemple, on modifie le fichier README dans monProjet1 et on pousse la modification : Par exemple, on modifie le fichier README dans monProjet1 et on pousse la modification :
-<cli>+<konsole> 
 +<nowiki>
 test@pc-bruno monProjet1$ echo "Modif depuis 1">>README && git add READMEtest@pc-bruno monProjet1$ git commit -m "chgt depuis 1" && git push test@pc-bruno monProjet1$ echo "Modif depuis 1">>README && git add READMEtest@pc-bruno monProjet1$ git commit -m "chgt depuis 1" && git push
 [master 5cebb57] chgt depuis 1 [master 5cebb57] chgt depuis 1
Ligne 377: Ligne 414:
 To /home/test/monProjetCentral To /home/test/monProjetCentral
    0a1efb5..5cebb57  master -> master    0a1efb5..5cebb57  master -> master
-</cli>+</nowiki> 
 +</konsole>
  
 puis on modifie aussi README dans monProjet2 **sans avoir mis à jour** (donc sans faire de pull). puis on modifie aussi README dans monProjet2 **sans avoir mis à jour** (donc sans faire de pull).
-<cli>+<konsole> 
 +<nowiki>
 test@pc-bruno monProjet2$ echo "Modif depuis 2">>README && git add README test@pc-bruno monProjet2$ echo "Modif depuis 2">>README && git add README
 test@pc-bruno monProjet2$ git commit -m "chgt depuis 2" && git push test@pc-bruno monProjet2$ git commit -m "chgt depuis 2" && git push
Ligne 393: Ligne 432:
 astuce: (par exemple 'git pull ...') avant de pousser à nouveau. astuce: (par exemple 'git pull ...') avant de pousser à nouveau.
 astuce: Voir la 'Note à propos des avances rapides' dans 'git push --help' pour plus d'information. astuce: Voir la 'Note à propos des avances rapides' dans 'git push --help' pour plus d'information.
-</cli>+</nowiki> 
 +</konsole>
  
 Nous avons modifié README à partir d'une version antérieure à celle sur le serveur et donc le push automatique n'est pas possible, il faut d'abord mettre à jour la copie locale. Dans ce cas, plusieurs situation peuvent se présenter soit les modifications peuvent être appliquée automatiquement soit il faut régler le problème manuellement.   Nous avons modifié README à partir d'une version antérieure à celle sur le serveur et donc le push automatique n'est pas possible, il faut d'abord mettre à jour la copie locale. Dans ce cas, plusieurs situation peuvent se présenter soit les modifications peuvent être appliquée automatiquement soit il faut régler le problème manuellement.  
  
-<cli>+<konsole> 
 +<nowiki>
 test@pc-bruno monProjet2$ git pull test@pc-bruno monProjet2$ git pull
 remote: Counting objects: 5, done. remote: Counting objects: 5, done.
Ligne 407: Ligne 448:
 CONFLIT (contenu) : Conflit de fusion dans README CONFLIT (contenu) : Conflit de fusion dans README
 La fusion automatique a échoué ; réglez les conflits et validez le résultat. La fusion automatique a échoué ; réglez les conflits et validez le résultat.
-</cli>+</nowiki> 
 +</konsole>
  
 Dans le cas le contenu du fichier en conflit est modifié par git pour indiquer les différences des versions : Dans le cas le contenu du fichier en conflit est modifié par git pour indiquer les différences des versions :
-<cli>+<konsole> 
 +<nowiki>
 test@pc-bruno monProjet2$ cat README  test@pc-bruno monProjet2$ cat README 
 Hello Hello
Ligne 418: Ligne 461:
 Modif depuis 1 Modif depuis 1
 >>>>>>> 5cebb57a2be60b9f7fbbe49b5735c256d1d285bf >>>>>>> 5cebb57a2be60b9f7fbbe49b5735c256d1d285bf
-</cli>+</nowiki> 
 +</konsole>
  
 Il faut éditer le fichier (ou utiliser un outils graphique de résolution de conflit) pour remettre le fichier dans un état cohérent c'est-à-dire : écraser la version locale par celle de l'entrepôt, faire le contraire ou fusionner en fonction de la situation.  Il faut éditer le fichier (ou utiliser un outils graphique de résolution de conflit) pour remettre le fichier dans un état cohérent c'est-à-dire : écraser la version locale par celle de l'entrepôt, faire le contraire ou fusionner en fonction de la situation. 
Ligne 424: Ligne 468:
 Dans notre exemple, nous avons fusionné en utilisant un éditeurs de texte les modifications dans monProjet2. Puis il faut les valider, les pousser dans l'entrepôt monProjetCentral. Dans notre exemple, nous avons fusionné en utilisant un éditeurs de texte les modifications dans monProjet2. Puis il faut les valider, les pousser dans l'entrepôt monProjetCentral.
  
-<cli>+<konsole> 
 +<nowiki>
 test@pc-bruno monProjet2$ git add README  test@pc-bruno monProjet2$ git add README 
 test@pc-bruno monProjet2$ git commit -m "Résolution du conflit" test@pc-bruno monProjet2$ git commit -m "Résolution du conflit"
Ligne 438: Ligne 483:
 To /home/test/monProjetCentral To /home/test/monProjetCentral
    5cebb57..c982ffe  master -> master    5cebb57..c982ffe  master -> master
-</cli>+</nowiki> 
 +</konsole>
  
 On peut alors éventuellement mettre à jour monProjet1. On peut alors éventuellement mettre à jour monProjet1.
-<cli>+<konsole> 
 +<nowiki>
 test@pc-bruno monProjet1$ git pull test@pc-bruno monProjet1$ git pull
 remote: Counting objects: 10, done. remote: Counting objects: 10, done.
Ligne 453: Ligne 500:
  README | 2 ++  README | 2 ++
  1 file changed, 2 insertions(+)  1 file changed, 2 insertions(+)
-</cli>+</nowiki> 
 +</konsole>
  
 <WRAP center round tip 60%> <WRAP center round tip 60%>