changed 5 years ago
Published Linked with GitHub

Git workflow

Voir dans quelle branche on se trouve

$ git branch
  christmas-feature
* master
  easter-egg

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
Nous sommes ici dans la branche master, repérée par l'*

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
La branche master est la branche par défaut sur tous les repositories

Créer une nouvelle branche masuperfeature

$ git checkout -b masuperfeature --track origin/master

Une nouvelle branche du nom de masuperfeature est créée et nous nous retrouvons maintenant dedans.

Changer de branche

Pour aller dans la branche coolfeature (déjà créée) :

$ git checkout coolfeature

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
Dans le prompt de notre terminal, on peut afficher la branche courante dans laquelle on se trouve, comme par ex :

(master) $ git checkout coolfeature
(coolfeature) $ 

Voir cet article.

Faire un commit

Pour voir où on en est localement, ie :

  • les fichiers modifiés/supprimés
  • les nouveaux fichiers, dits untracked
$ git status
On branch masuperfeature
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   app.js
	deleted:    old.js

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	README

On add ensuite tous les fichiers (nouveaux ou modifiés) que l'on veut inclure à notre commit et l'on rm tous ceux que l'on veut supprimer du répo :

$ git add README app.js
$ git rm old.js

Un ultime git status avant de faire notre commit histoire de s'assurer que tout est bon (en vert), puis:

$ git commit -m "Ajout de la doc et cleaning"

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
git status donne beaucoup d'info y compris certaines commandes comme par ex pour annuler un changement sur un fichier : git checkout -- <file>

Pousser une branche

Pour envoyer nos commits locaux vers le serveur distant (Github) :

$ git push origin masuperfeature

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
On doit forcément être dans la branche locale masuperfeature pour pousser vers la branche distance masuperfeature (même nom).

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
Si la branche distante n'existait pas encore, elle sera créée automatiquement.

Pousser une branche permet :

  • à d'autres devs de récupérer mon travail
  • de faire une sauvegarde de son travail ailleurs (si jamais on perdait son laptop dans le métro)

Merger une branche dans une autre

Si je veux récupérer le code d'un collègue bossant sur la branche api.

Dans ma propre branche :

$ git pull origin api

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
AVANT de faire le pull, je m'assure par un git status de n'avoir aucune modification en cours.

Si c'est le cas, je prends le temps de faire un commit AVANT.

Resoudre des conflits (méthode de base)

💥Boom

Lors d'un merge, si 2 développeurs ont modifié la même ligne de code, git ne saura pas quelle version prendre Il mettra alors le merge en pause, et vous demandera de résoudre les conflits, avant de pouvoir finaliser le merge :

$ git pull origin api
From https://github.com/abernier/ironme
Auto-merging public/stylesheets/style.scss
CONFLICT (content): Merge conflict in public/stylesheets/style.scss
Automatic merge failed; fix conflicts and then commit the result.

Vous pourrez retrouver la liste des fichiers en conflit par un git status :

$ git status
On branch features/about
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)
	both modified:   public/stylesheets/style.scss

no changes added to commit (use "git add" and/or "git commit -a")

NB : Notez le Unmerged paths


git status est vraiment notre meilleur ami, il nous donne toujours de bons conseils 🧚🏼‍♂️

💏Résolution

Si l'on inspecte le fichier en conflit :

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
Le conflit est délimité par des chevrons entre les lignes 4 et 10 :

<<<<<<< HEAD
v1
=======
v2
>>>>>>> 6b7380c886e0906f6a5efd2b600be8fcf390fa4d

Il nous faut réconcilier v1 et v2 ensemble, tout simplement en éditant le fichier et en enlevant les signes bizarres :

🤝Souvent lors de la résolution d'un conflit, on contactera l'auteur avec lequel notre version conflicte pour se mettre d'accord sur la résolution.

✅ commit de merge

Une fois le fichier édité et le conflit résolu, il nous faut marquer le fichier comme mergé et faire un commit de merge (sans message) :

$ git add public/stylesheets/style.scss

Un petit git status vous dira maintenant qu'il n'y a plus de conflit :

$ git status
On branch master
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:
	modified:   public/stylesheets/style.scss

NB : Notez le message : use "git commit" to conclude merge

La commande git commit sans message de commit, ouvre un éditeur de texte Vim avec un message de commit pré-rempli :

$ git commit
Merge branch 'master' of https://github.com/abernier/ironme into features/about

# Conflicts:
#	public/stylesheets/style.scss
#
# It looks like you may be committing a merge.
# If this is not correct, please remove the file
#	.git/MERGE_HEAD
# and try again.


# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch features/about
# All conflicts fixed but you are still merging.
#
# Changes to be committed:
#	modified:   public/stylesheets/style.scss
#

Pour sauvegarder le message de commit et quitter Vim, nous appuyons sur les touches :wq

Si l'on aime pas Vim, on peut aussi définir VScode comme éditeur de texte par défaut :

$ echo "export EDITOR=\"code -w\"" >>~/.profile

And voilà, le conflit est maintenant résolu 🙌

On oublie pas de pousser le commit de merge, avec que la résolution du conflit puisse profiter à d'autres (et qu'ils n'aient pas à la refaire eux-même) :

$ git push origin master

Résoudre des conflits (avec git mergetool)

Le principe reste le même, on des conflits, mais pour la résolution, on va cette fois-ci s'aider d'un outil graphique pour mieux visualiser les 2 versions côte-à-côte

Configuration

Pour les utilisateurs sous Windows et Ubuntu, vous devrez installer le logiciel Meld et le configurer sur votre machine.

Pour les utilisateurs sous mac, je vous recommande d'utiliser plutôt Filemerge, dont voici les instructions pour le configurer.


NB: Dans les préférences de Filemerge, cochez l'option Compress white space:

Utilisation

La commande git mergetool va pour chacun des fichiers en conflit, démarrer l'interface graphique (Meld ou Filemerge) :

$ git mergetool
Merging:
public/stylesheets/style.scss

Normal merge conflict for 'public/stylesheets/style.scss':
  {local}: modified file
  {remote}: modified file

qui lancera alors une interface graphique pour résoudre le conflit :

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
A gauche et droite : les 2 versions en conflits.
Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
En bas : notre version "réconciliée" (et éditable !)

☝️Occupez-vous seulement des blocks en rouge ! Les autres ne sont pas en conflit.

Une fois le conflit résolu, ne pas oublier de +s sauver le fichier du milieu avant de +qquitter l'interface.

Si plusieurs fichiers en conflit, il vous faudra quitter entre chaque. git mergetool relancera l'interface pour chaque fichier en conflit.


👉Idem, on oublie pas ensuite de faire le ✅commit de merge !

Select a repo