Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédenteDernière révisionLes deux révisions suivantes | ||
technique:git:git_avancees [2020/01/04 18:09] – francoisa | technique:git:git_avancees [2021/09/20 21:37] – francoisa | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== Git : fonctionnalités avancées ====== | ====== Git : fonctionnalités avancées ====== | ||
- | Pour pouvoir utiliser pleinement Git, il peut être utile de s' | + | Pour pouvoir utiliser pleinement Git, il peut être utile de s' |
===== 1. Création de branches ===== | ===== 1. Création de branches ===== | ||
Ligne 68: | Ligne 68: | ||
</ | </ | ||
+ | |||
===== Gestion de conflits ===== | ===== Gestion de conflits ===== | ||
Ligne 74: | Ligne 75: | ||
Il faut éditer les fichiers en conflit et finir avec un : | Il faut éditer les fichiers en conflit et finir avec un : | ||
- | git add fichiers_en_conflit\\ | + | < |
+ | git add fichiers_en_conflit | ||
git commit | git commit | ||
+ | |||
+ | </ | ||
Il est possible d' | Il est possible d' | ||
Ligne 99: | Ligne 103: | ||
</ | </ | ||
+ | |||
+ | ===== Travail collaboratif ===== | ||
+ | |||
+ | Récupérer un dépot distant avec : | ||
+ | |||
+ | < | ||
+ | git clone url_distant | ||
+ | |||
+ | </ | ||
+ | |||
+ | Dans ce cas, l' | ||
+ | |||
+ | git fetch permet de récupérer les branches distantes. Attention, git pull <⇒ git fetch | ||
+ | |||
+ | < | ||
+ | git pull # récupère les sources et merge les différences | ||
+ | git fetch # récupère les sources sans fusionner | ||
+ | |||
+ | </ | ||
+ | |||
+ | git pull = git fetch + git merge FETCH_HEAD | ||
+ | |||
+ | Pour voir les différences avec le dépot distant : | ||
+ | |||
+ | < | ||
+ | git remote -v | ||
+ | git branch -r # pour voir les branches distantes connues localement | ||
+ | git branch -vv # si la branche loclae est trackée | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== Ajout d'un dépot supplémentaire distant ===== | ||
+ | |||
+ | < | ||
+ | git remote add nomchoisi urldepot.git | ||
+ | |||
+ | git fetch nomchoisi | ||
+ | |||
+ | </ | ||
+ | |||
+ | Et pour mettre à jour le dépot local vers ce dépot distant : | ||
+ | |||
+ | < | ||
+ | git push -u nomchoisi master | ||
+ | |||
+ | </ | ||
+ | |||
+ | Attention, il faudra mettre à jour les 2 dépots de manière manuelle. Par exemple : | ||
+ | |||
+ | < | ||
+ | git push heroku master | ||
+ | |||
+ | git push -u nomchoisi master | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== Gestion d'un dépot avec authentification par clef SSH ===== | ||
+ | |||
+ | 1) Ajouter sa clef SSH publique dans son profil du dépot distant (github, framagit…) | ||
+ | |||
+ | 2) Définir par défaut l' | ||
+ | < | ||
+ | Host github.com | ||
+ | | ||
+ | |||
+ | </ | ||
+ | |||
+ | 3) définir pour le dépot git local que l' | ||
+ | < | ||
+ | [remote " | ||
+ | url = ssh:// | ||
+ | |||
+ | </ | ||
+ | |||
+ | Et c'est tout. Au prochain '' | ||
+ | ===== Gestion d'un fork d'un projet distant ===== | ||
+ | |||
+ | Cas fréquent : on veut contribuer à un projet existant : | ||
+ | |||
+ | - On forke le projet existant depuis la plateforme | ||
+ | - On clone ce projet localement sur son PC (git clone) | ||
+ | - On crée une nouvelle branche locale de développement (git branch nouvbranche && git checkout nouvbranche) | ||
+ | - on ajoute cette branche distante | ||
+ | - On modifie le code, on commite (git commit -m " | ||
+ | - On retourne sur la plateforme et on crée une PR Pull Request | ||
+ | |||
+ | **Problème** | ||
+ | |||
+ | Il faut définir un dépot upstream du dépot existant : | ||
+ | |||
+ | < | ||
+ | git remote add upstream git@github.com: | ||
+ | git fetch upstream # on se calle sur upstream et on affiche les branches disponibles | ||
+ | git checkout master # pour se mettre localement sur la branche master | ||
+ | git reset --hard upstream/ | ||
+ | |||
+ | </ | ||
+ | |||
+ | On n' | ||
+ | |||
+ | < | ||
+ | git checkout -b nouvellebranche | ||
+ | |||
+ | </ | ||
+ | |||
+ | La fois suivante, pour remettre à jour : | ||
+ | |||
+ | < | ||
+ | git checkout master # pour se mettre localement sur la branche master | ||
+ | git reset --hard upstream/ | ||
+ | git fetch upstream | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== Pour récupérer des commits d' | ||
+ | |||
+ | Se placer dans la branche qui contient les anciens commits : | ||
+ | |||
+ | < | ||
+ | git checkout anciennebranche | ||
+ | git log # pour afficher les commits du plus récent au plus ancien idcommit3, idcommit2, idcommit1 | ||
+ | git checkout master # pour repasser dans la branche master | ||
+ | git checkout -b nouvellebranche # pour créer et se placer dans la nouvelle branche | ||
+ | git cherry-pick idcommit1 idcommit2 idcommit3 | ||
+ | git log # pour afficher les commits récupérés | ||
+ | git branch --track master origin/ | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== Stocker ses accès (sur un serveur sécurisé) ===== | ||
+ | |||
+ | Editer le '' | ||
+ | |||
+ | < | ||
+ | [remote " | ||
+ | url = https:// | ||
+ | |||
+ | </ | ||
+ | |||
+ | Ceci peut être définié au moment du clone : | ||
+ | |||
+ | < | ||
+ | git clone https://< | ||
+ | |||
+ | </ | ||
+ | |||
+ | On peut aussi stocker ces infos dans les credentials ('' | ||
+ | |||
+ | < | ||
+ | git config credential.helper store # pour les activer globalement ou | ||
+ | git config --global credential.helper store # pour les activer localement dans chaque dépot | ||
+ | |||
+ | </ | ||
+ | |||
+ | Et au pull ou push suivant, les infos de connexions sont mémorisées ! | ||
+ | |||
+ | ===== Déboguer du code bugué depuis un commit inconnu ===== | ||
+ | |||
+ | git bisect permet de faire ça : Trouver par recherche binaire la modification qui a introduit un bogue. (cf [[https:// | ||
+ | |||
+ | Technique par dichotomie entre 2 commits : l'un avec le bug (bad), l' | ||
+ | |||
+ | Exemple : | ||
+ | < | ||
+ | |||
+ | git bisect start # démarrage de git bisect | ||
+ | git bisect bad # La version actuelle est mauvaise | ||
+ | git bisect good v2.6.13-rc2 # la version v2.6.13-rc2 | ||
+ | |||
+ | </ | ||
+ | |||
+ | Et se laisser guider. | ||
+ | |||
+ | < | ||
+ | git bisect reset # pour revenir au HEAD d' | ||
+ | |||
+ | </ | ||
+ | |||
+ | Marche aussi avec un script de test qui doit renvoyer 0 pour être valide : | ||
+ | |||
+ | < | ||
+ | git bisect run mon_script arguments | ||
+ | |||
+ | </ | ||
+ | |||