par Benjamin DIELEMAN

décembre 2019
     

Objectifs de la séance

  • Scénario pratique sur 2 dépôts sur Gitlab
  • Un peu de théorie au milieu
  • Un zeste de bonnes pratiques


→ Évaluation semaine suivante

I. Connexion Gitlab

Clé SSH


						# Créer une clé SSH
						ssh-keygen -t rsa -b 2048

						cat ~/.ssh/id_rsa.pub

						# Ajouter au compte Gitlab, puis tester authentification
						ssh git@gitlab.iut-valence.fr
						

Git remote

  • Lors d'un git clone ou git remote add
  • Lie notre repo local à un repo distant
  • origin : Nom par défaut de ce repo distant
  • Lien HTTPS / SSH (via protocole GIT)

II. Initialiser mon projet

  • Créer projet privé sur Gitab git-formation-monidentifiant
  • Créer dossier projet

						cd
						mkdir git-formation-monidentifiant

						cd git-formation-monidentifiant
						git init
						git remote add origin git@gitlab.iut-valence.fr:monidentifiant/git-formation-monidentifiant.git
						git ci --allow-empty -m "Initial commit"


						git push -u origin master
						

=> Puis protéger la branche master sur Gitlab

Bonnes pratiques commit

Commit atomique ☢

  • Il concerne une seule chose
  • Il est le plus petit possible (tout en restant cohérent)


Ne doit donc pas
  • Mélanger une amélioration et une correction
  • Mélanger plusieurs fonctionnalités / améliorations
  • Mélanger plusieurs corrections différentes

Bonnes pratiques commit

  • En anglais (Sauf indication contraire)
  • Titre de commit clair et succinct
    • Ce que fait le commit
    • Commence par un verbe à l'impératif
  • Description détaillée si nécessaire
    • Séparé par une ligne vide
    • Références au tracker, issues...
    • Descriptions / Choix techniques

Bonnes pratiques commit

Exemples de bons messages de commit


						Create runner for update job

						­ UpdateJobRunner handle execution of an update job
						1° Can run a background process to execute the job separately
						2° Is called by the process to execute the update job
						­ Create UpdateJobRunnerFactory service

						Tracker #1505
						

						Define directory to store update job reports
						

						Enable Sqlite database

						Configure Doctrine with pdo_sqlite driver
						

Bonnes pratiques commit

Exemple de mauvais commit


						(BD) Install kilik/table
						

						Improve the project
						

						Fix some bugs
						

						Fix that + Improve this + Add something + Buy coffee
						

						C'est un trou de verdure où chante une rivière, Accrochant follement aux herbes des haillons
						

Enregistrer des modifications

  1. Développer
  2. Une modification cohérente ?
  3. git add {file|directory}
  4. git status : Vérifie l'état du staging
  5. git commit
  6. Écrire un message de commit et valider

III. Des commits pour mon dépôt


						touch index.html
						git add index.html
						git status
						git commit
					

						nano index.html # <html><body><h1>yep</h1></body></html>
						git add .
						git st
						git ci
					

						touch page.html
						nano index.html # <a href="page.html">Page</a>
						git add .
						git st
						git ci
					

						git push
					

git push

  • git push {remote} {branche} : Envoi de la branche
  • git push origin -u new-feature:new-feature : Envoi et lie de la branche
  • git push origin :new-feature : Supprime branche distante


Le plus souvent, sur master `git push`



git push --force : Jamais pour une branche partagée
=> Mais pour mes branches 😇

git checkout


						git checkout {branch/commit}
						# Déplace le `HEAD` et garde les modifs en cours
						# Change de branche ou reviens à un état antérieur...
					


⚠️ Les modifications en cours non commitées changent de branche avec moi

Créer une branche


					git checkout master # Je positionne HEAD sur le master
					git branch test # nouvelle branche depuis HEAD
					git checkout test # positionne sur la branche
					git commit # commit sur la nouvelle branch
					


Ou raccourci :


					git checkout master -b test
					

III. Des branches pour mon dépôt

Branche mergé via Gitlab


						git co master -b branche-1
						touch file-1.html  # + commit
						git push origin -u branche-1
					
=> merge via Gitlab

Branche mergé en CLI


						git co master
						git pull # Log ?
						git co -b branche-2
						touch file-2.html  # + commit
						git co master
						git merge branche-2
						git push # On pousse le master avec la branche mergée
					

ff vs no-ff

III. Des branches pour mon dépôt

Branche mergé no-ff en CLI


						git co master
						git co -b branche-3
						touch file-3.html  # + commit
						git co master
						git merge --no-ff branche-3
						git push
					

IV. Dépôt partagé

Inviter collègue de droite en "Développeur"


						cd ..
						git clone git@gitlab.iut-valence.fr:colleguedegauche/git-formation-colleguedegauche.git
						cd git-formation-colleguedegauche
					

Travailler sur ce projet


						git co master -b branche-monidentifiant
						touch fonction-monidentifiant.html   # + commit
						git push origin -u branche-monidentifiant
					

IV. Dépôt partagé

J'ai un bug sur mon dépôt


						cd ../git-formation-monidentifiant
						git co master
						# Corriger le index.html + commit + push
					

Récupérer l'avancée du master


						cd ../git-formation-colleguedegauche

						# Récupère son travail sur le master
						git co master
						git fetch  # git log pour voir
						git pull
					

IV. Dépôt partagé

Prendre en compte la correction dans ma branche


						git co branche-monidentifiant
						git rebase master
						git push --force
						# ⚠ pas de push --force sur des branches partagées
					

Avant rebase


					A---B---C---D ← master
					     \
					      E---F---G ← new-feature
					

Après rebase


					A---B---C---D ← master
					             \
					              E'---F'---G' ← new-feature
					

git fetch

Importe les informations du repo distant

git fetch

=> Ajoute / Met à jour les références origin/*


Importe + supprime les références n'existant plus

git fetch --prune

Affiche les branches locales + distantes

git branch --all

git pull

Import + merge les informations distantes

git pull {remote}
git pull {remote} {branche}

Les pull sont en mode rebase.
cf config globale dans .gitconfig

l1 = log --graph --oneline --decorate --pretty=format:"%C(yellow)%h\\ %ad%Cred%d\\ %Creset%<(50,trunc)%s%Cblue\\ [%cn]" --date=short

l2 = log --stat --oneline --decorate --graph --all

l5 = log --name-status --graph --oneline --decorate --all --pretty=format:"%C(yellow)%h\\ %Cblue%ad%Cred%d\\ %C(cyan)%<(50,trunc)%s%Cblue\\ [%cn]" --date=short