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ó

  1. 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
    
  2. 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.

  3. Eliminar les marques de conflicte: Després de resoldre el conflicte, elimina les marques de conflicte del fitxer.

  4. Afegir els fitxers resolts a l'índex: Utilitza git add per marcar els fitxers com a resolts.

    $ git add file.txt
    
  5. 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ó:

$ git add index.html
$ git commit -m "Resolt conflicte de fusió en index.html"

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

  1. Crea dues branques a partir de main: branch1 i branch2.
  2. Modifica el mateix fitxer en ambdues branques de manera que es generi un conflicte de fusió.
  3. Intenta fusionar branch2 a branch1 i resol el conflicte.

Solució

  1. Crea les branques:

    $ git checkout -b branch1
    $ git checkout main
    $ git checkout -b branch2
    
  2. Modifica el fitxer example.txt en branch1:

    $ echo "Línia de branch1" > example.txt
    $ git add example.txt
    $ git commit -m "Afegida línia en branch1"
    
  3. Modifica el fitxer example.txt en branch2:

    $ echo "Línia de branch2" > example.txt
    $ git add example.txt
    $ git commit -m "Afegida línia en branch2"
    
  4. Intenta fusionar branch2 a branch1:

    $ git checkout branch1
    $ git merge branch2
    
  5. 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
    
  6. 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

Mòdul 3: Branques i Fusió

Mòdul 4: Treballant amb Repositoris Remots

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

Mòdul 8: Millors Pràctiques i Consells de Git

Mòdul 9: Resolució de Problemes i Depuració

Mòdul 10: Git en el Món Real

© Copyright 2024. Tots els drets reservats