Dans le premier article git for ops nous avons appris à :
- Créer un repo sur Github ou VSTS
- Configurer une clé ssh pour Git
- Ajouter/Supprimer des fichiers à l’index local
- Commit des fichiers dans l’index local
- Cloner un repo ou ajouter une source distante
- Récupérer le travail existent dans le repo distant
- Envoyer ces commits dans le repository distant
- Créer une branche
Dans cet article, nous allons aller un peu plus loin et apprendre quelques éléments de git qui sont primordiaux lorsque l’on travaille avec des branches.
Git checkout
La commande git checkout permet de se changer de branche de travail. C’est à dire que si nous faisons la commande git checkout masuperfeature
, les fichiers et les dossiers seront ceux de la branche en question. Faisons donc un petit exercice pour bien comprendre comment cela fonctionne :
Vous pouvez créer un repository git local sans server pour cet exercice, c’est que j’ai fais moi même et par conséquent je n’utilise pas les commande
git push
etgit pull
pour simplifier cet exercice.
# on se place dans la branche master
git checkout master
# on creer un fichier vide :
touch monfichier.txt
# on l"ajoute au "stage" :
git add monfichier.txt
# puis on commit :
git commit -m "mon commit dans master"
# puis on change de branch, le -b permet de créer la branche si elle n"existe pas encore
git checkout -b manouvellebranche
# on valide qu"elle est bien a jour par rapport au serveur
ls
# qui nous retourne :
monfichier.txt
Maintenant, ajoutons un fichier dans cette nouvelle branche :
touch monfichier2.txt
git add monfichier2.txt && git commit -m "mon commit dans manouvellebranche"
Retournons dans la branche “master” :
# on change vers master
git checkout master
# on creer un nouveau fichier :
touch monfichiermaster.txt
git add monfichiermaster.txt && git commit -m "ajout du fichier dans master"
ls
# nous retourne :
monfichier.txt monfichiermaster.txt
# si nous retournons dans la branche manouvellebranche :
git checkout manouvellebranche
ls
monfichier2.txt monfichier.txt
Conclusion: les branches permettent d’isoler le travail sans se mélanger entre collègues ou entre features.
Git rebase
Il est assez fréquent de travailler sur plusieurs branches en parallèle et qui nous oblige lors de modification importante dans la branche principale de faire “redescendre” les modifications de la branche “master” (ou celle qui a servi de base à la création). Nous allons voir comment récupérer ces modifications dans notre branche “manouvellebranche” :
git checkout manouvellebranch
ls
git rebase master
git checkout manouvellebranch
First, rewinding head to replay your work on top of it...
Applying: mon commit dans manouvellebranche
Git Merge
Une fois que notre feature est prête, il peut être intéressant de migrer le travail dans la branche “mère”. Dès lors nous allons pouvoir “merger”, il existe plusieurs façon de merger, soit on merge tout avec l’historique de chaque commit dans la branche “mère”, soit on merge sans l’historique, rassembler dans un seul commit, je préfère cette option afin de ne pas polluer l’historique de la branche de “production” :
# ajoutons quelques fichiers dans la branche manouvellebranche
touch toto{0..9}{0..9}.txt
git add toto*
git commit -m "adding 100 files"
Ensuite, changeons de branche puis effectuons un merge, simple (le moins bien):
git checkout master
git merge manouvellebranch
Et si je me suis trompé ?
# d"abord on vérifie l"id du commit : (-B permets de récupéré 6 lignes de avant le contexte, -A la meme chose mais apres le contexte)
git log | grep -B 6 -A 6 adding
commit 126d0fe758ebb8b7c155d58968063edec996a673
Author: Etienne Deneuve <etienne.deneuve@cellenza.com>
pubDate: Thu Jun 28 13:07:27 2018 +0200
adding 100 file
commit c9323cb10debb1a0a028f9e7db65a622fb8906a1
Author: Etienne Deneuve <etienne.deneuve@cellenza.com>
pubDate: Thu Jun 28 12:27:02 2018 +0200
mon commit dans manouvellebranche
# puis on annule notre commit en prenant celui juste avant notre erreur :
git reset c9323cb10debb1a0a028f9e7db65a622fb8906a1
git status
On branch master
nothing to commit, working tree clean
Cela tombe, bien nous allons pouvoir faire le deuxième merge (le mieux):
git checkout master
git merge --squash manouvellebranch
git status
On branch master
Changes to be committed:
(use "git reset HEAD ..." to unstage)
new file: toto00.txt
new file: toto99.txt
# dès lors, nous devons commiter:
git commit -m "oui, c"est bon on y va !"