Important
Attention, les captures d’écran faites sur GitLab proviennent d’une ancienne version de la forgeMIA. Cela ne devrait pas géner la compréhension et la bonne lecture des supports.
Les supports seront mis à jour au moment du passage à la forge institutionnelle.
Nous avons vu :
Nous avons vu :
main
est toujours stable (i.e. fonctionnelle)main
Sur une seule branche :
Et le tout en même temps !
Scénario classique :
main
ou master
)Les fonctionnalités évoluent dans des branches séparées
Fusion (merge) avec main
L’exemple précédent fonctionne si :
Sinon, il est nécessaire de faire un rebasage.
Il n’est pas de nécessaire de faire un rebasage.
Chaque branche est construite à partir de la branche main
.
Ici on ne pourra pas faire un merge de la branche Fonction-2 avant son rebasage.
Récupération du projet et exploration de son contenu
On peut :
Cliquez sur le nom d’une branche pour voir le dépôt dans l’état correspondant
Via une issue
Via le menu branche
Avec ces méthodes de création d’une branche depuis GitLab, il faut récupérer la nouvelle branche en local.
# Lister toutes les branches disponibles (locales et distantes)
git branch -a
# Récupérer le contenu de la branche
git pull origin la_branche_distante
# se mettre dessus
git switch la_branche_distante
Un git pull
dans RStudio et VS Code permet de récupérer automatiquement la branche dans l’IDE.
Note
Nous conseillons de passer par une issue pour créer une branche (parce que tout part d’une idée et que l’on veut en garder une trace, même lorsque l’on travaille seul!)
D’une issue à une branche
On s’arrête là pour le moment !
git pull
ou en cliquant sur le bouton pull
de RStudio.
En ligne de commande (dans le terminal RStudio) :
Cette commande permet de crée une branche nom_de_ma_branche
à partir de l’étiquette v2.9.1
et bascule sur celle-ci.
Ou via la fenêtre de commit
(dans le terminal de RStudio)
Pour créer une branche depuis git-2.23 (août 2019)
# Création de la branche patch-1
git branch patch-1
# Basculer sur la branche patch-1
git switch patch-1
# Basculer si switch n'est pas disponible
git checkout patch-1
# Ou en raccourci
git switch -c patch-1
La commande suivante :
permet de :
patch-1
à partir de l’étiquette v2.9.1
main
* patch-1
NB : l’historique affiche le nom des branches
e82b921 (HEAD -> patch-1, tag: v2.9.1, main) init
Basculer d’une branche à une autre
# connaître la branche en cours
git branch
# Naviguer parmis les branches
git checkout main
git checkout patch-1
git checkout patch-2
# ou depuis git-2.23
git switch patch-1
git switch - # bascule sur la précédente branche (patch-1 ici)
# montrer l’historique de la branche
git log patch-1
# montrer l’historique de toutes les branches
git log --all
patch-1
v2.9.1
v2.9.1
patch-1
Basculer d’une branche à une autre
Il n’est pas possible de gérer les branches distantes via RStudio, il faudra passer par les lignes de commandes.
# Récupérer une branche distante :
git fetch
git switch patch-1
# Récupérer les modifications de la branche distante :
git pull
# Envoyer les modifications sur la branche distante :
git push origin patch-1
avec origin
l’alias du dépôt distant (par défaut).
NB : possibilité de renommer la branche.
avec origin
l’alias du dépôt distant (par défaut).
On branch local-patch-1
Your branch is up to date with 'origin/remote-patch-1'.
Conseil
Synchroniser les modifications locales avec celles distantes
L’icône identifiée apparaît tant que la branche locale n’existe pas sur le serveur distant.
Impossible de faire cela avec l’interface VS code.
Il est nécessaire de passer par la ligne de commande, dans le terminal.
gérer la branche
Définition
Le merge request est une requête de fusion spécifique à GitLab qui vise à incorporer des changements d’une branche spécifique dans la branche principale (main).
Fusion de hotfix sur main puis de issue-1 sur main
GitLab permet de simplifier les étapes :
Dans les faits, GitLab facilite le merge request.
En cas de modifications différentes de la même partie du même fichier dans les deux branches, Git ne sera pas capable de réaliser proprement la fusion.
Git ajoute des marques de conflit standards dans les fichiers qui comportent des conflits, pour que vous puissiez les ouvrir et résoudre les conflits manuellement.
Votre fichier avec conflit contient des sections qui ressemblent à ceci :
<<<<<<< HEAD:patch-1
<div id="footer">contact : email.support@github.com</div>
======
<div id="footer">
please contact us at support@github.com
</div>
>>>>>>> patch-1:index.html
git status
<<<<<<<
et >>>>>>>
<<<<<<< HEAD:patch-1
<div id="footer">contact : email.support@github.com</div>
======
<div id="footer">
please contact us at support@github.com
</div>
>>>>>>> patch-1:index.html
======
correspond au “centre” du conflitConseil
Prenez votre temps au moment de la résolution de conflit !
Dans le cas où :
git stash
enregistre dans la pile des modifications non finies que vous pouvez ré-appliquer à n’importe quel moment.
Pour retrouver ses modifications : git stash apply
.
Git remodifie les fichiers non validés lorsque la remise a été créée.
Une remise peut être appliquée sur une branche différente de celle où elle a été créée. Git vous indique les conflits de fusions si quoi que ce soit ne s’applique pas proprement.
git stash drop <nom de la remise>
pour enlever une remise de la liste.
Si vous attendez trop longtemps pour fusionner deux branches qui divergent rapidement, vous rencontrerez des problèmes.
Gestion d’un conflit
Le formateur crée une situation de conflit et la résoud.
git clean -f
.git clean -f -d
.gitignore
: git clean -f -x
Pour plus d’information sur le remisage et le nettoyage : https://git-scm.com/book/fr/v2/Utilitaires-Git-Remisage-et-nettoyage
Définition
Permet de modifier l’origine d’une branche.
Utilité
Problème : les modifications apportées par le 1er merge ne sont pas intégrées à la branche Fonction-2
avant de la fusionner dans main
Rebaser la branche Fonction-2
sur main
après le merge de Bug-fonction-1
:
Peut se faire dans GitLab dans la requête de fusion
On constate qu’on a modifié l’historique pour le rendre linéaire
Important
Le rebasage réécrit l’historique des commits
Cela peut engendrer des problèmes si d’autres développeurs travaillent sur la même branche en même temps
Recommandations
De préférence, rebaser uniquement des branches :
Rebasage
main
!git status
au début d’une séquence de travail pour vérifier sur quelle branche on estgit pull
pour récupérer d’éventuels commitDeux grandes manières d’utiliser des branches :
Un mode d’utilisation des branches basé sur un scénario “gitflow”
Formation Git / GitLab − Session 3 : les branches