User Tools

Site Tools


projtec:git

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
projtec:git [2017/10/19 15:43] orelprojtec:git [2024/03/18 15:06] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ====== Git ====== ====== Git ======
  
-Un bon tutoriel pour jouer de manière interactive : https://learngitbranching.js.org/+Un bon tutoriel pour jouer de manière interactive (https://learngitbranching.js.org/) et une sandbox en bonus (https://learngitbranching.js.org/?NODEMO).
  
 Commençons par créer un dépôt Git "remote" vide, qui se trouve en principe sur un serveur distant. Dans cet exemple, il se trouvera dans le répertoire /tmp/remote de la machine locale. Commençons par créer un dépôt Git "remote" vide, qui se trouve en principe sur un serveur distant. Dans cet exemple, il se trouvera dans le répertoire /tmp/remote de la machine locale.
Line 25: Line 25:
 # mail / user name # mail / user name
 git config --global user.name "orel" git config --global user.name "orel"
-git config --global user.mail aurelien.esnard@u-bordeaux.fr+git config --global user.email aurelien.esnard@u-bordeaux.fr
 # editeur de texte # editeur de texte
 git config --global core.editor emacs git config --global core.editor emacs
Line 189: Line 189:
 ==== Les branches locales et distantes ==== ==== Les branches locales et distantes ====
  
-Par défaut, nous travaillons sur la branche //master// du dépôt local.+Par défaut, nous travaillons sur la branche //master// du dépôt local que nous synchronisons avec la branche distante //origin/master// du dépôt distant avec les commandes //git pull// et //git push//. 
 +Il est possible de créer et d'utiliser d'autres branches. C'est particulièrement utile pour développer une nouvelle fonctionnalité, expérimenter des choses ou réparer un bug, sans perturber le reste du projet.
  
 Nous allons maintenant créer une nouvelle branche //hotfix//, afin de corriger un bug. Nous allons maintenant créer une nouvelle branche //hotfix//, afin de corriger un bug.
Line 200: Line 201:
 </code> </code>
  
-Nous sommes encore dans la branche //master// comme l'indique "*". Passons dans la branche //hotfix// et corrigeons le bug... +Nous sommes encore dans la branche //master// comme l'indique "*". Passons dans la branche //hotfix// :
 <code bash> <code bash>
-git checkout hotfix+git switch hotfix
 git branch  git branch 
 * hotfix * hotfix
   master   master
 +</code>
 +
 +Regardons l'état du dépôt : 
 +<code bash>
 +git log --graph --oneline
 +* c908469 (HEAD -> hotfix, origin/master, origin/HEAD, master) bla bla
 +* d144ffa autre bla bla
 +(...)
 +</code>
 +
 +Le dernier commit est bien commun à la branch hotfix, la branch master. Corrigeons le "bug" maintenant :
 +
 +<code bash>
 date >> date.txt date >> date.txt
 git add date.txt git add date.txt
Line 212: Line 225:
 </code> </code>
  
-Une fois le bug corrigé, nous pouvons le commiter dans la branche courante //hotfix//. Notons que cela n'a aucun impact sur la branche //master//. Pour propager cette modification vers la branche //master//, il va falloir repasser dans la branche //master// et effectuer un //merge//.+Une fois le bug corrigé, nous pouvons le commiter dans la branche courante //hotfix//. Notons que cela n'a aucun impact sur la branche //master//:
  
 <code bash> <code bash>
-git checkout master+git log --graph --oneline 
 +* c38c81a (HEAD -> hotfix) deux dates dans hotfix 
 +* c908469 (origin/master, origin/HEAD, master) bla bla 
 +* d144ffa autre bla bla 
 +(...) 
 +</code> 
 + 
 +Pour propager cette modification vers la branche //master//, il va falloir repasser dans la branche //master//, faire quelques modifs sur master puis effectuer un //merge//
 + 
 +<code bash> 
 +git switch master 
 +date >> date2.txt 
 +git add date2.txt 
 +git commit -m "date2.txt"
 git merge hotfix git merge hotfix
 </code> </code>
  
-On peut finalement supprimer la branche quand cette dernière n'est plus utile.+<code bash> 
 +git log --graph --oneline 
 +*   36db317 (HEAD -> master) Merge branch 'hotfix' 
 +|\   
 +| * c38c81a (hotfix) deux dates dans hotfix 
 +|/   
 +* c908469 bla bla 
 +* d144ffa autre bla bla 
 +</code>
  
-  git branch -hotfix+Pour propager ces modifications dans le dépôt distant on fera des pull/push comme d'habitude.
  
-Si l'on souhaite que sa branche locale //mybranch// deviennent une branche distante (ou "remote") : 
  
-  git checkout mybranch +Si l'on souhaite que sa branche locale //hotfix// deviennent une branche distante (ou "remote") :
-  git push --set-upstream origin mybranch     +
-  +
  
-Pour voir toutes les branches (locales et distantes:+<code bash> 
 +  git log --graph --oneline 
 +    * c38c81a (HEAD -> hotfixdeux dates dans hotfix 
 +    * c908469 bla bla 
 +    * d144ffa autre bla bla 
 +    (...) 
 +  git switch hotfix 
 +  git push --set-upstream origin hotfix 
 +  git log --graph --oneline 
 +    * c38c81a (HEAD -> hotfix, origin/hotfix) deux dates dans hotfix 
 +    * c908469 bla bla 
 +    * d144ffa autre bla bla 
 +    (...) 
 +</code>
  
 +La encore on se synchronisera avec la branche distance à l'aide des commandes push/pull:
 +
 +<code bash>
 +  date >> date.txt
 +  git add date.txt
 +  git commit -m "mise à jour de la date"
 +  git log --graph --oneline
 +    * 68b1978 (HEAD -> hotfix) mise à jour de la date
 +    * c38c81a (origin/hotfix) deux dates dans hotfix
 +    (...)
 +  git push
 +  git log --graph --oneline
 +    * 68b1978 (HEAD -> hotfix, origin/hotfix) mise à jour de la date
 +    * c38c81a deux dates dans hotfix
 +    (...) 
 +</code>
 +
 +
 +Pour voir toutes les branches (locales et distantes) :
 +<code bash>
   git fetch -p   git fetch -p
   git branch -a   git branch -a
 +</code>
      
 __Nota Bene__ : le //fetch// permet de mettre à jour son cache local et éventuellement (option -p) d'effacer dans ce cache les références à des branches mortes ! __Nota Bene__ : le //fetch// permet de mettre à jour son cache local et éventuellement (option -p) d'effacer dans ce cache les références à des branches mortes !
      
-Pour récupérer une branche distante et la suivre via une branche locale : 
  
-  git checkout --track origin/mybranch+Puis pour supprimer la branche locale, il faut faire ceci :   
 +<code bash> 
 +  git branch -d mybranch 
 +</code>
  
-Puis pour supprimer la branche distante (enfin presque...), il faut faire ceci :   
  
 +Puis pour supprimer la branche distante (enfin presque...), il faut faire ceci :  
 +<code bash>
   git push origin --delete mybranch   git push origin --delete mybranch
-   +</code>  
-Expliquer le //rebase// simple :+
  
-  git checkout mybranch +Pour récupérer une branche distante et la suivre via une branche locale : 
-  git rebase master +<code bash> 
-  git checkout master +  git checkout --track origin/mybranch 
-  git merge mybranch+</code> 
 + 
 +Considérons le cas suivant... Expliquer ensuite le //rebase// simple : 
 + 
 +<code bash> 
 +  git switch mybranch 
 +  git rebase master        #  
 +  git switch master 
 +  git merge mybranch       # merge naif
   git branch -d mybranch   git branch -d mybranch
 +</code>
  
 Pour aller plus loin : Pour aller plus loin :
Line 281: Line 357:
 ==== Restaurer un fichier supprimé ou une ancienne version ==== ==== Restaurer un fichier supprimé ou une ancienne version ====
  
-Si l'on souhaite annuler les modifications faites dans le //working directory// après le dernier commit... +Si l'on souhaite annuler les modifications faites sur un fichier dans le //working directory// (qui ne sont pas encore commités)... c'est-à-dire, si l'on souhaire récupérer un fichier dans sa dernière version commitée :
- +
-  git checkout +
- +
-Ou bien pour récupérer un fichier //myfile// dans sa dernière version commitée :+
  
   git checkout -- myfile   git checkout -- myfile
Line 294: Line 366:
   git checkout <commit> -- <path/to/myfile>   git checkout <commit> -- <path/to/myfile>
  
-Si l'on souhaite annuler les derniers commits dans le dépôt local pour revenir à la version précédente identifiée par <commit> : 
  
-  git reset --hard <commit>+Lorsque l'on a commité (en local) des trucs par erreur, il est possible d'annuler facilement un commit à condition de ne pas l'avoir push ! Par exemple, si l'on souhaite annuler le dernier commit, on peut faire :  
 + 
 +  git reset --hard HEAD~1
      
-Je n'ai pas compris ce qui se passe si on revient à une version précédente au dernier //push// ?+Attention, l'option --hard a pour effet de supprimer *définitivement* dans vos fichiers les modifications du dernier commit... 
  
-// A compléter... avec revert !//+Si on souhaite maintenant annuler le dernier commit sans toucher aux fichiers, par exemple pour corriger un commit incomplet, on peut faire : 
 + 
 +  git reset HEAD~1   
 +   
 +Dans ce cas, les fichiers impliqués dans le commit annulé apparaissent comme *modified and not staged*... A vous de retravailler ces fichiers et de proposer un nouveau commit ! Une autre solution à ce problème consiste à faire un nouveau commit qui se fusionne avec l'ancien grâce à l'option --amend : 
 + 
 +  git commit -m "maj de mon dernier commit..." --amend 
 + 
 +Autre cas de figure, j'ai commité des modifs sur deux fichiers (*good* et *bad*), et je souhaite annuler partiellement mon commit en annulant les modifs sur le fichier *bad*, sans pour autant perdre les modifications sur ce fichier dans répertoire local... 
 + 
 +  git reset HEAD~1                  # reset global (HEAD recule) 
 +  git add good 
 +  git commit -m "update good only" 
 +   
 +Ou encore, une solution un peu plus tricky... 
 + 
 +  git reset HEAD~1 -- bad           # reset partiel (HEAD ne bouge pas) 
 +  git commit -m "update good only" --amend 
 +   
 + 
 +Dans le cas, où l'on a *push* le commit que l'on souhaite supprimer, les chosent se compliquent car elles peuvent maintenant impacter d'autres utilisateurs du dépôt Pas trop de choix dans ce cas, il faut faire un *revert* qui se présentera comme un nouveau commit qui annule l'ancien... mais tout restera écrit dans l'historique :-( 
 + 
 +  git revert HEAD~1 
 +  git push 
 + 
 +Si l'on souhaite synchroniser à nouveau son dépôt local avec *origin/master* en ignorant les supprimant les derniers commits locaux (non synchronisés), on peut biensûr faire un nouveau git clone, mais il y a plus simple et plus rapide : 
 + 
 +  git reset --hard origin/master 
 + 
 +A utiliser avec prudence ! Néanmoins, vos anciens commits ne sont pas totalement perdus, on peut les retrouver en faisant : 
 + 
 +  git reflog
  
  
Line 334: Line 438:
   # ... continue hacking ..   # ... continue hacking ..
  
 +==== Utilisation du Worktree ====
 +
 +C'est une alternative au stash pour réaliser des développements concurrents dans des branches différentes...
 +
 +  $ git worktree add /path/to/myproject_mybranch mybranch # or <commitID>
 +    Preparing worktree (checking out 'mybranch')
 +    HEAD is now at 88d22d5 ...
 +    
 +  $ git worktree list
 +    /path/to/myproject 231b057 [master]
 +    /path/to/myproject_mybranch 88d22d5 [mybranch]
 +
 +L'idée c'est que le .git/ n'est pas dupliqué !
 +
 +=== Suppression d'une Branche Distante ====
 +
 +Pour supprimer une branche locale sur votre ordinateur, la commande est la suivante :
 +
 +  $ git branch -d [nom_de_la_branche]
 + 
 +Ou bien : 
 +
 +  $ git branch -D [nom_de_la_branche]
 +
 +Pour supprimer la branche située sur le dépôt distant (syntaxe récente) :
 +
 +  $ git push origin --delete [nom_de_la_branche]
 +
 +Pour mettre à jour les changements sur un autre ordinateur, il faut faire :
 +
 +  $ git fetch --all -prune
 +
 +=> https://www.journaldunet.fr/web-tech/developpement/1202943-effacer-une-branche-git-a-la-fois-locale-et-distante/
 +==== Suppression de Commit Fautifs sur le dépôt distant ====
 +
 +Revenir à l'état désiré : 
 +
 +  $ git reset --hard <commit hash>
 +
 +Forcer cet état comme le dernier état du dépôt :
 +
 +  $ git push --force origin master
 +  
 +Attention : Ces commandes sont susceptibles d'engendrer le chaos lorsque plusieurs utilisateurs collaborent sur le même dépôt. https://makandracards.com/git/7347-supprimer-des-commits-fautifs-avec-git
 ==== Savane ==== ==== Savane ====
  
Line 352: Line 500:
 ==== A Lire ==== ==== A Lire ====
  
 +  * https://gitlab-ce.iut.u-bordeaux.fr/Pierre/DEMO-GIT-PT2
 +  * https://marklodato.github.io/visual-git-guide/index-en.html
 +  * https://help.github.com/articles/syncing-a-fork/
   * http://nvie.com/posts/a-successful-git-branching-model/   * http://nvie.com/posts/a-successful-git-branching-model/
   * https://marklodato.github.io/visual-git-guide/index-en.html   * https://marklodato.github.io/visual-git-guide/index-en.html
Line 357: Line 508:
   * https://yakiloo.com/getting-started-git-flow/   * https://yakiloo.com/getting-started-git-flow/
   * https://git-man-page-generator.lokaltog.net/   * https://git-man-page-generator.lokaltog.net/
 +  * https://thor.enseirb-matmeca.fr/ruby/docs/repository/git
projtec/git.1508427815.txt.gz · Last modified: 2024/03/18 15:05 (external edit)