Le mot qui fait peur
« Conflit ». Le terme est mal choisi : il évoque une perte de données, une erreur, quelque chose de cassé.
En réalité, un conflit signifie simplement ceci : deux personnes ont modifié les mêmes lignes du même fichier, et Git ne veut pas choisir à votre place. Il s’arrête et vous demande de trancher.
C’est exactement le comportement souhaitable. Un outil qui choisirait tout seul écraserait silencieusement le travail de quelqu’un.
Déroulons un cas complet, ligne par ligne.
La situation de départ
Chez Nordika, le script de connexion Logon.ps1 est dans le dépôt infrastructure/scripts-powershell. Le voici, dans sa version publiée — l’enregistrement a3f9c21 :
# Logon.ps1 - Script de connexion Nordika
$groupes = (Get-ADUser $env:USERNAME -Properties MemberOf).MemberOf
# Lecteur commun à tous
New-PSDrive -Name "S" -PSProvider FileSystem -Root "\\srv-fic01\commun" -Persist
# Lecteurs par service
if ($groupes -match "Compta") {
New-PSDrive -Name "P" -PSProvider FileSystem -Root "\\srv-fic01\compta" -Persist
}
Write-EventLog -LogName Application -Source "NordikaLogon" -EventId 1000 -Message "Connexion OK"
Deux personnes vont y toucher le même matin, sans le savoir. Voyons d’abord ce qui se passe la plupart du temps.
Scénario 1 — Git s’en sort tout seul
9h00 — Romain et Nicolas font tous deux git pull. Ils sont à jour, sur a3f9c21.
9h15 — Nicolas apprend que le partage comptabilité a migré vers un nouveau serveur. Il corrige le chemin :
if ($groupes -match "Compta") {
New-PSDrive -Name "P" -PSProvider FileSystem -Root "\\srv-fic02\compta" -Persist
}
git add Logon.ps1
git commit -m "Migration du partage compta vers SRV-FIC02"
git push
Publié. Le serveur est sur 7d2e881. Romain ne le sait pas.
9h40 — Romain, de son côté, répond à une demande du service RH. Il ajoute un bloc, plus bas dans le fichier :
# Lecteurs par service
if ($groupes -match "Compta") {
New-PSDrive -Name "P" -PSProvider FileSystem -Root "\\srv-fic01\compta" -Persist
}
if ($groupes -match "RH") {
New-PSDrive -Name "P" -PSProvider FileSystem -Root "\\srv-fic02\RH" -Persist
}
git add Logon.ps1
git commit -m "Ajout du lecteur P: pour le service RH"
git push
! [rejected] main -> main (fetch first)
Même rejet que tout à l’heure : le serveur a avancé. Romain tire :
git pull
Auto-merging Logon.ps1
Merge made by the 'ort' strategy.
Logon.ps1 | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
Aucun conflit. Git a fusionné seul, et le fichier contient maintenant les deux changements :
# Lecteurs par service
if ($groupes -match "Compta") {
New-PSDrive -Name "P" -PSProvider FileSystem -Root "\\srv-fic02\compta" -Persist
}
if ($groupes -match "RH") {
New-PSDrive -Name "P" -PSProvider FileSystem -Root "\\srv-fic02\RH" -Persist
}
Un git push, et c’est terminé. Romain n’a rien eu à faire.
Pourquoi ça marche
Git raisonne ligne par ligne, pas fichier par fichier.
Il compare les deux versions à leur ancêtre commun et constate :
| Zone du fichier | Modifiée par |
|---|---|
La ligne du lecteur P: de la Compta |
Nicolas seulement |
| Les lignes du nouveau bloc RH | Romain seulement |
Aucune ligne n’a été touchée par les deux. Git applique donc les deux changements l’un après l’autre, crée un enregistrement de fusion, et n’a rien à vous demander.