CSC 4509 – Algorithmique et communications des applications réparties

Portail informatique

Trucs & astuces — Git

Je recommence à travailler sur une branche qui n'est peut-être pas à jour

  • Je vérifie que je suis bien sur la branche en question avec la commande git branch.
    • Si j'ai des modifications non validées, je les valident. Si je ne sais pas que faire de ces modifications, je peux préferer repartir dans un nouveau répertoire et cloner dans un nouveau dépôt local.
  • Je charge les dernières modifications poussées sur le dépôt d'origine/de référence avec la commande git fetch.
  • Je vérifie l'état de ma branche par rapport avec ces dernières mises à jour avec l'outil gitk --all.
  • Si je suis d'accord pour avancer jusqu'à la dernière image de la branche, j'avance pour me mettre à jour avec la commande git pull.
  • Si je préfère partir sur une autre branche, je crée la branche et commence à travailler dessus avec la commande git checkout -b ma_nouvelle_branche.

En cas de panique, comment je recommence à travailler ?

« En cas de panique » :

  • on clone à nouveau le dépôt et continue dans la branche sprint1 :
    • mv repertoire-projet-a-probleme repertoire-projet-a-probleme-old # garder une copie au cas où du contenu n'ait pas été poussé
      git clone url_votre_projet
      git checkout XXX # on se replace dans la branche de travail courante

Je termine une séance de travail ; que dois-je faire ?

  • Je construis un nouvel instantané contenant les dernières modifications que je souhaite rendre accessibles. J'utilise les commandes git status, git add... et git commit.
  • Je vérifie que la branche de mon dépôt local est à jour par rapport à la même branche du dépôt GitLab, qui est le dépôt de référence, avec la commande git fetch, et au besoin, je mets à jour mon dépôt local avec la commande git pull origin. Je peux avoir à résoudre des conflits (cf. la question « Je fusionne (merge) deux branches »).
  • Je pousse mes instantanés sur le dépôt GitLab avec la commande git push origin....

Comment je fusionne une branche dans la branche main ?

  • Avant de changer de branche (pour aller sur la branche main), au besoin, je construis un nouvel instantané avec git status, git add... et git commit.
  • Je me déplace sur la branche main avec la commande git checkout main.
  • Je vérifie que la branche main de mon dépôt local est à jour par rapport à la même branche du dépôt GitLab, qui est le dépôt de référence, avec la commande git fetch, et au besoin, je mets à jour mon dépôt local avec la commande git pull origin.... Je peux avoir à résoudre des conflits (cf. la question « Je fusionne (merge) deux branches »).
  • Je fusionne avec la commande git merge --no-ff mabranche. Il est alors possible que des conflits apparaissent (cf. à nouveau la question « Je fusionne (merge) deux branches »).

Je pose une étiquette

  • J'utilise la commande git tag -a monEtiquette.

Je nettoie mon répertoire local

  • Je liste les répertoires et les fichiers non suivi (untracked) avec la commande git status.
  • Je liste les répertoires et les fichiers qui seraient supprimés avec la commande git clean -nd
  • Si je suis sûr que toutes les entrées sont à supprimer, j'utilise la commande git clean -fd

Quels sont les outils de fusion de branches (merge tools) disponibles sur ma machine

  • Je liste les outils avec la commande git mergetool --tool-help.

Je configure mon dépôt local pour choisir l'outil de fusion de branches (merge tool) à utiliser dans les futures fusions

  • Je liste ces outils avec la commande git mergetool --tool-help.
  • Je vérifie ma configuration avec la commande git config --global merge.tool.
  • Je configure mon dépôt pour utiliser, par exemple meld, avec la commande git config --global merge.tool meld.

Je fusionne (merge) deux branches

  • Je vérifie que le répertoire de travail est « propre », c'est-à-dire qu'il n'y a ni contenu non suivi (untracked) ni contenu modifié non validé (commit), avec la commande git status.
  • Au besoin, je valide les dernières modifications avec les commandes git add... et git commit.
  • Je me déplace dans la branche d'arrivée avec la commande git checkout....
  • Je fusionne de façon à voir un instantané qui montre la fusion, avec la commande git merge --no-ff : par exemple git merge --no-ff branche_feature_a_fusionner.
  • Si des conflits sont détectés, j'exécute la commande git mergetool pour utiliser un outil aidant à la résolution du conflit : par exemple git mergetool -t meld
    • Chaque outil possède son propre mode de fonctionnement. Pour aller plus loin, nous vous conseillons de consulter la page suivante : ici

J'étiquette (tag) une branche et pousse l'étiquette sur le dépôt d'origine/de référence

  • Je liste les étiquettes existantes avec la commande git tag -l ou l'outil gitk --all.
  • J'ajoute une étiquette avec la commande git tag -a : par exemple git tag -a....
  • Je pousse l'étiquette sur le dépôt d'origine/de référence avec la commande git push : par exemple git push origin....
    • Vous pouvez pousser toutes les étiquettes avec la commande git push origin --tags, mais avec le risque de pousser des étiquettes que vous ne souhaitiez pas pousser.

Je supprime une étiquette (tag) poussée par erreur sur le dépôt d'origine/de référence

  • Je liste les étiquettes existantes avec la commande git tag -l ou l'outil gitk --all.
  • Je supprime l'étiquette distante avec la commande git push --delete origin tag_to_remove ou la commande git push origin :tag_to_remove.
  • Au besoin, je supprime l'étiquette locale avec la commande git tag -d tag_to_remove.

Je change de branche tout de suite

  • Je vérifie que je n'ai pas de modifications en cours dans la branche courante ; si j'ai des fichiers en cours de modifications, je peux :
    1. (le plus simple) terminer ces modifications, les ajouter à la zone de transit (staging area) avec la commande git add... et les valider avec la commande git commit, ou
    2. (pour ceux qui veulent aller plus loin) mettre de côté ces modifications avec la commande git stash.
  • Je change de branche avec la commande git checkout....

Je récupère un fichier d'une autre branche sans faire de fusion

  • Je ne veux pas faire de fusion de branche par exemple car il y aurait trop de changements. Je souhaite récupérer la dernière version, c'est-à-dire le fichier du dernier instantané (snapshot).
    • Il est possible de récupérer d'un autre instantané en indiquant dans la suite l'identifiant (SHA1) en lieu et place du nom de la branche.
  • Je peux récupérer uniquement un fichier, par exemple chemin_vers_fichier/fichier_a_recuperer, d'une branche, par exemple autre_branche, avec la commande git checkout autre_branche chemin_vers_fichier/fichier_a_recuperer.
  • Comme cette récupération n'est pas visible dans l'arbre des instantanés, je valide ce changement en mettant un message approprié avec la commande git commit -m "fichier_a_recuperer en provenance de la branche autre_branche".

Je vois toujours une branche ancienne qui n'existent plus sur le dépôt d'origine/de référence (car un autre membre du projet l'a retirée)

  • Je mets à jour mon dépôt local avec l'option -p (pour prune) de la commande git fetch, ce qui donne la commande git fetch -p.
    • Les anciennes branches qui n'existent plus sur le dépôt distant ont disparu.

Je supprime une branche qui a été poussée par erreur sur le dépôt d'origine/de référence

  • Je me mets sur une autre branche avec la commande git checkout autre_branche.
  • Je supprime la branche sur le dépôt distant avec la commande git push origin :branche_a_supprimer (notez le caractère « : »).
  • Au besoin, je supprime aussi la branche locale avec la commande git branch -d branche_a_supprimer, voire avec la commande git branch -D branche_a_supprimer même si je perds du contenu (des instantanés) par exemple parce que la branche n'a pas été fusionnée.

Je nettoie mon dépôt local suite à la suppression de branches

  • La suppression de branches peut laisser des parties de graphes non incluses dans une branche : c'est du contenu « mort ». Je peux nettoyer mon dépôt avec la commande git gc.

Quelle est la syntaxe des fichiers .gitignore ?

  • Vous pouvez lire ici.

Comment diminuer la quantité d'affichage de la commande git status ?

  • Essayez les options -s et --porcelain.

Comment connaître la liste des entrées ignorées ?

  • Avec la commande git status --ignored.

Je n'ai pas l'outil gitk ou je souhaite un affichage du graphe des instantanés (snapshot) dans la console avec git status

  • Essayez la commande git log --graph puis git log --graph --oneline.

 

 

 


$Date: 2017-05-17 13:01:17 +0200 (mer. 17 mai 2017) $