logo telecom ipp

GIT: Level 2

Plan de travail:

  • git branch: gérer les branches
    • locale
    • distante
  • git stash: enregistrer les modifications courantes dans un conteneur pour pouvoir changer de version courante
    • git stash pop, git stash clear
  • git revert: annuler l'effet d'un commit en créant le commit opposé
  • git remove: cesser de suivre un fichier dans git et détruire la copie
  • git commit --amend: ajouter des changements au précédent commit (pas encore poussé)
  • git checkout -- file: supprimer les modifications locales d'un fichier
  • git fetch: récupérer les dernières données du dépôt distant sans changer la copie de travail et sans faire de fusion.
  • git tag: associer un nom symbolique à un état du dépôt
  • git reset: opposé de git add, permet d'enlever des fichiers du stage
  • alias utiles
  • fast-forward

GIT: Cheat sheet

Vous pouvez trouver une série de tutoriels videos pour se sortir des erreurs classiques

GIT: Branches

  • Vous avez déjà manipulé une branche: master.
  • Une branche n'est rien qu'une étiquette sur un commit.
  • Une branche peut être locale ou distante.
  • Supprimer une branche ne supprime pas les commits, mais peut laisser des commits "en l'air" (sans pointeur pour y arriver)
  • Utilisez des noms de branches explicites, sans accents et sans espaces
  • Quand vous faites un commit, la branche courante avance sur le nouveau commit.
  • Vous pouvez supprimer une branche distante; la syntaxe est horrible, alors utilisez une interface graphique (smartGit, gitKraken, eclipse, IntelliJ...)

Scenario d'utilisation de branches

Vous recevez un rapport d'erreur sur la v2 alors que vous développez la v3:

  • commit vos changements à la v3
  • git checkout v2
  • faites des changements sur la v2, corrigez l'erreur, testez, git add, git commit
  • git checkout v3
  • reprenez le développement de la v3

Pourquoi branche ?

Parce que les commits successifs créent une ligne, et quand deux personnes travaillent depuis une même version, ça crée une fourche.

Une branche n'est autre qu'une étiquette sur un commit.

master est la branche par défaut.

branche

GIT: Revert

Vous avez fait une bétise et commit sur une branche une version qui ne devrait pas y être.

Vous voudriez supprimer un commit.

En GIT, vous pouvez faire un second commit qui inverse les changements du premier, et ça s'appelle git revert

git revert HEAD crée un commit inversant le commit courant (celui qui arrive à l'état courant)

GIT: Remove

Supprimer un fichier n'est pas la même chose que cesser de suivre (track) ce fichier dans GIT.

git rm file supprime le fichier ET cesse de le suivre (après commit)

git rm --cached file cesse de suivre le fichier dans git (après commit) sans le supprimer du dossier courant. Il apparaitra comme "untracked", sauf s'il est mentionné dans .gitignore

GIT: Amend

Vous venez de faire commit, et vous vous rendez compte que vous avez oublié une ou deux modifications. Vous les faites, puis

git add modifs puis

git commit --amend pour ajouter les modifs au commit précédent.

Bien sûr, il ne faut pas faire celà si vous avez déjà fait un push. Si vous avez déjà fait un push, alors faites un autre commit. Il n'y a pas de commit trop petit.

GIT: Checkout --

Vous avez effacé un fichier Main.java par erreur, ou vous l'avez modifié malencontreusement.

git checkout -- Main.java (il y a un espace avant et après le --)

Et votre fichier Main.java est restoré à son état antérieur.

GIT: Fetch

Vous voulez voir ce qu'ont fait les autres, mais vous n'avez pas encore le courage de faire un gros merge. Alors plutôt que de faire git pull, faites git fetch pour faire l'équivalent du pull sans le merge.

GIT: Tag

Vous voudriez l'équivalent d'une branche mais qui ne suit pas les commits, une étiquette qui reste sur le commit où elle a été placée. Par exemple, vous voulez mettre l'étiquette: 'versionPan3QuiMarche'

Ca s'appelle un tag: vous faites checkout de la version à tagger et

git tag versionPan3QuiMarche

GIT: Reset

Vous avez fait git add sur tous les fichiers modifiés, puis vous vous rappelez qu'un fichier Main.java n'est pas prêt pour le commit. Les autres modifications sont demandées en urgence.

git reset Main.java fait sortir Main.java du stage, donc fait l'inverse de git add. Main.java ne fait plus partie du prochain commit.

Utiles

  • git shortlog -s -n --all : nombre de commit par auteur
  • git log --all --decorate --oneline --graph : présente une version texte d'une vue des branches

Fast-forward

Un fast-forward est un merge trivial.

Pour un merge, il y a la version courante et la version à fusionner. Si la version à fusionner est sur une autre branche, la fusion n'est pas triviale.

Par contre, vous êtes sur master, vous venez de faire un git fetch et plusieurs nouveaux commits sont apparus sur master, origin/master est "devant" master. A ce moment, git merge origin/master est un fast-forward.

ff

Ressources et crédits

Une ressource de référence très complète et en anglais: git-scm.org

Si vous avez des problèmes, regardez cette page d'aide qui recense toutes les questions difficiles sur git posées en TP INF103

Les autres cours de cette série sont:

Ce cours a été conçu par Jean-Claude Dufourd, et mis à disposition en Creative Commons 3, BY-NC-SA (attribution, non commercial, partage à l'identique)