Introducció
Quan es treballa amb Git, és comú trobar-se amb conflictes de fusió, especialment quan múltiples desenvolupadors treballen en el mateix projecte. Un conflicte de fusió ocorre quan Git no pot fusionar automàticament els canvis de dues branques perquè hi ha canvis contradictoris en els mateixos fitxers. En aquesta secció, aprendrem com identificar, resoldre i evitar conflictes de fusió.
Identificant Conflictes de Fusió
Quan Ocorren els Conflictes de Fusió?
Els conflictes de fusió poden ocórrer en diverses situacions, com ara:
- Dos desenvolupadors editen la mateixa línia en un fitxer.
- Un desenvolupador elimina un fitxer que un altre desenvolupador ha editat.
- Canvis contradictoris en la mateixa àrea d'un fitxer.
Com Identificar un Conflicte de Fusió?
Quan intentes fusionar una branca i Git troba un conflicte, rebràs un missatge d'error similar a aquest:
$ git merge feature-branch Auto-merging file.txt CONFLICT (content): Merge conflict in file.txt Automatic merge failed; fix conflicts and then commit the result.
Git també marcarà els fitxers conflictius amb el següent format:
<<<<<<< HEAD Contingut de la branca actual. ======= Contingut de la branca fusionada. >>>>>>> feature-branch
Resolent Conflictes de Fusió
Passos per Resoldre un Conflicte de Fusió
-
Identificar els fitxers conflictius: Utilitza
git status
per veure quins fitxers tenen conflictes.$ git status On branch main 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: file.txt
-
Editar els fitxers conflictius: Obre els fitxers conflictius en el teu editor de text preferit i busca les marques de conflicte (
<<<<<<<
,=======
,>>>>>>>
). Decideix quina part del codi conservar, eliminar o combinar. -
Eliminar les marques de conflicte: Després de resoldre el conflicte, elimina les marques de conflicte del fitxer.
-
Afegir els fitxers resolts a l'índex: Utilitza
git add
per marcar els fitxers com a resolts.$ git add file.txt
-
Finalitzar la fusió: Finalment, realitza un commit per completar la fusió.
$ git commit -m "Resolt conflicte de fusió entre main i feature-branch"
Exemple Pràctic
Suposem que tenim un fitxer index.html
amb el següent contingut en la branca main
:
<!DOCTYPE html> <html> <head> <title>Pàgina Principal</title> </head> <body> <h1>Benvingut a la Pàgina Principal</h1> </body> </html>
I en la branca feature-branch
, el mateix fitxer ha estat modificat així:
<!DOCTYPE html> <html> <head> <title>Pàgina Principal</title> </head> <body> <h1>Benvingut a la Nova Pàgina Principal</h1> </body> </html>
Quan intentem fusionar feature-branch
a main
, obtindrem un conflicte:
$ git merge feature-branch Auto-merging index.html CONFLICT (content): Merge conflict in index.html Automatic merge failed; fix conflicts and then commit the result.
El fitxer index.html
es veurà així:
<!DOCTYPE html> <html> <head> <title>Pàgina Principal</title> </head> <body> <<<<<<< HEAD <h1>Benvingut a la Pàgina Principal</h1> ======= <h1>Benvingut a la Nova Pàgina Principal</h1> >>>>>>> feature-branch </body> </html>
Per resoldre el conflicte, decidim combinar els canvis:
<!DOCTYPE html> <html> <head> <title>Pàgina Principal</title> </head> <body> <h1>Benvingut a la Nova Pàgina Principal</h1> </body> </html>
Després, afegim el fitxer resolt a l'índex i finalitzem la fusió:
Consells per Evitar Conflictes de Fusió
- Comunica't amb el teu equip: Assegura't que tots els membres de l'equip estiguin al corrent dels canvis que s'estan fent.
- Fes commits petits i freqüents: Això facilita la fusió de canvis i redueix la probabilitat de conflictes.
- Actualitza la teva branca sovint: Fes
git pull
regularment per mantenir la teva branca actualitzada amb els canvis de la branca principal.
Exercici Pràctic
Exercici
- Crea dues branques a partir de
main
:branch1
ibranch2
. - Modifica el mateix fitxer en ambdues branques de manera que es generi un conflicte de fusió.
- Intenta fusionar
branch2
abranch1
i resol el conflicte.
Solució
-
Crea les branques:
$ git checkout -b branch1 $ git checkout main $ git checkout -b branch2
-
Modifica el fitxer
example.txt
enbranch1
:$ echo "Línia de branch1" > example.txt $ git add example.txt $ git commit -m "Afegida línia en branch1"
-
Modifica el fitxer
example.txt
enbranch2
:$ echo "Línia de branch2" > example.txt $ git add example.txt $ git commit -m "Afegida línia en branch2"
-
Intenta fusionar
branch2
abranch1
:$ git checkout branch1 $ git merge branch2
-
Resol el conflicte editant
example.txt
i eliminant les marques de conflicte:<<<<<<< HEAD Línia de branch1 ======= Línia de branch2 >>>>>>> branch2
Decideix quina línia conservar o combina-les:
Línia de branch1 i branch2
-
Finalitza la fusió:
$ git add example.txt $ git commit -m "Resolt conflicte de fusió en example.txt"
Conclusió
Resoldre conflictes de fusió és una habilitat essencial per a qualsevol desenvolupador que treballi en equips col·laboratius. Amb la pràctica, esdevindràs més eficient en la identificació i resolució de conflictes, assegurant un flux de treball més suau i productiu. En la següent secció, explorarem la gestió de branques per mantenir el teu projecte organitzat i eficient.
Dominar Git: De Principiant a Avançat
Mòdul 1: Introducció a Git
Mòdul 2: Operacions Bàsiques de Git
- Creant un Repositori
- Clonant un Repositori
- Flux de Treball Bàsic de Git
- Preparant i Cometent Canvis
- Veient l'Historial de Commits
Mòdul 3: Branques i Fusió
- Entenent les Branques
- Creant i Canviant de Branques
- Fusionant Branques
- Resolent Conflictes de Fusió
- Gestió de Branques
Mòdul 4: Treballant amb Repositoris Remots
- Entenent els Repositoris Remots
- Afegint un Repositori Remot
- Recuperant i Traient Canvis
- Empenyent Canvis
- Seguint Branques
Mòdul 5: Operacions Avançades de Git
Mòdul 6: Eines i Tècniques de Git
Mòdul 7: Estratègies de Col·laboració i Flux de Treball
- Forking i Pull Requests
- Revisions de Codi amb Git
- Flux de Treball Git Flow
- GitHub Flow
- Integració Contínua amb Git
Mòdul 8: Millors Pràctiques i Consells de Git
- Escrivint Bons Missatges de Commit
- Mantenint un Historial Netejat
- Ignorant Fitxers amb .gitignore
- Millors Pràctiques de Seguretat
- Consells de Rendiment
Mòdul 9: Resolució de Problemes i Depuració
- Problemes Comuns de Git
- Desfent Canvis
- Recuperant Commits Perduts
- Tractant amb Repositoris Corruptes
- Tècniques Avançades de Depuració