Samenwerken op een semantisch model met Git en Azure DevOps

Yorrick Zijlstra · Maart 2026 · 10 min leestijd

Power BI .pbip projectstructuur met Git branching en Azure DevOps

Power BI is van oorsprong een single-user tool. Je opent een .pbix-bestand, maakt je wijzigingen, en slaat op. Maar zodra je met meerdere ontwikkelaars aan hetzelfde model werkt, loopt dat vast. Wie heeft de laatste versie? Wie heeft wat aangepast? En hoe merge je twee parallelle wijzigingen zonder dat je elkaars werk overschrijft?

Sinds Power BI Desktop het .pbip-formaat ondersteunt, is er een serieus antwoord: versiebeheer met Git. In combinatie met Azure DevOps Repos krijg je branching, pull requests, code reviews en een volledige wijzigingshistorie -- precies zoals software-ontwikkelaars al jaren werken.

Het probleem met .pbix

Een .pbix-bestand is een binair ZIP-archief. Git kan daar niet mee overweg: het ziet het hele bestand als een blob, niet als losse onderdelen. Twee ontwikkelaars die tegelijk aan hetzelfde .pbix werken, kunnen hun wijzigingen niet samenvoegen. Je bent veroordeeld tot "ik was er eerst" of handmatig copy-pasten van measures en tabellen.

Dat is precies waarom Microsoft het .pbip-formaat heeft geïntroduceerd.

Wat is het .pbip-formaat?

Een .pbip (Power BI Project) is geen enkel bestand, maar een mapstructuur met leesbare tekstbestanden. In plaats van een binaire blob krijg je losse JSON- en TMDL-bestanden (Tabular Model Definition Language) per tabel, measure, relatie en expressie.

De structuur ziet er als volgt uit:

MijnProject.pbip
MijnProject.SemanticModel/
  definition/
    model.tmdl
    tables/
      fct_Verkopen.tmdl
      dim_Product.tmdl
      dim_Datum.tmdl
      dim_Klant.tmdl
    relationships.tmdl
    expressions.tmdl
  definition.pbism
MijnProject.Report/
  definition/
    report.json
    pages/
      Pagina1/
        visuals/
          ...
  definition.pbir

Het cruciale verschil: elke tabel, elke measure-groep en elke relatie is een apart bestand. Als jij aan fct_Verkopen.tmdl werkt en je collega aan dim_Product.tmdl, raakt jullie werk elkaar niet.

.pbip inschakelen

Open Power BI Desktop en ga naar File > Options and settings > Options > Preview features. Schakel Power BI project (.pbip) save format in. Herstart Desktop.

Sla je bestand nu op via File > Save as en kies het .pbip-formaat. Je ziet dat Power BI een mapstructuur aanmaakt in plaats van een enkel bestand.

Let op: Het .pbip-formaat is op dit moment nog een preview-feature. General Availability staat gepland voor Q3 2026. Het formaat is forward-compatible: je kunt een .pbip altijd openen in een nieuwere versie van Desktop. Zorg dat je team dezelfde (of nieuwere) versie van Desktop gebruikt.

Git en Azure DevOps instellen

Nu je een mapstructuur hebt, kun je Git gebruiken. De setup:

1. Repository aanmaken

Maak een nieuwe Git-repository aan in Azure DevOps (of GitHub). Clone de repo lokaal.

git clone https://dev.azure.com/jouw-org/PowerBI/_git/SalesModel
cd SalesModel

2. .gitignore instellen

Niet alle bestanden in een .pbip-project horen in Git. Voeg een .gitignore toe:

# Power BI lokale cache
.pbi/
*.pbix

# Lokale settings
localSettings.json

# OS bestanden
.DS_Store
Thumbs.db

3. Project toevoegen en committen

Kopieer je .pbip-project naar de repo-map en maak je eerste commit:

git add .
git commit -m "Initieel semantisch model: star schema met 4 dimensies"
git push origin main

Branching-strategie

Met Git kun je parallel werken op branches. Voor Power BI-projecten werkt een eenvoudige strategie het beste:

Branch Doel Wie
main Productie-versie van het model. Altijd stabiel. Niemand direct, alleen via PR
develop Integratietak voor lopende ontwikkeling Alle ontwikkelaars (via PR)
feature/* Individuele wijzigingen Per ontwikkelaar
hotfix/* Urgente fixes op productie Wie nodig is

Een typische workflow:

# Nieuwe feature starten
git checkout develop
git pull origin develop
git checkout -b feature/voortschrijdend-gemiddelde

# Werk doen in Power BI Desktop...
# Wijzigingen committen
git add MijnProject.SemanticModel/
git commit -m "Voeg 3-maands voortschrijdend gemiddelde measure toe"

# Pull request aanmaken naar develop
git push origin feature/voortschrijdend-gemiddelde

In Azure DevOps maak je vervolgens een Pull Request aan. Je collega reviewt de DAX, keurt goed, en merged naar develop.

TMDL: wat zit er in die bestanden?

TMDL (Tabular Model Definition Language) is de tekstrepresentatie van je semantisch model. Elke tabel krijgt een eigen .tmdl-bestand. Hier is een voorbeeld van hoe een measure eruitziet in TMDL:

table fct_Verkopen

  measure 'Totale Omzet' =
    SUM(fct_Verkopen[Bedrag])
    formatString: #,##0
    displayFolder: Financieel

  measure '% Groei MoM' =
    VAR HuidigeMaand = [Totale Omzet]
    VAR VorigeMaand =
      CALCULATE(
        [Totale Omzet],
        DATEADD(dim_Datum[Datum], -1, MONTH)
      )
    RETURN
      DIVIDE(HuidigeMaand - VorigeMaand, VorigeMaand)
    formatString: 0.0%
    displayFolder: Financieel

Omdat dit leesbare tekst is, kan Git precies tonen wat er veranderd is. Een diff laat zien: "Er is een nieuwe measure toegevoegd" of "De formatString van Totale Omzet is gewijzigd van #,##0 naar #,##0.00".

Merge conflicts oplossen

Merge conflicts ontstaan als twee ontwikkelaars tegelijkertijd hetzelfde bestand wijzigen. Met .pbip is de kans kleiner dan met .pbix (omdat onderdelen in aparte bestanden staan), maar het kan nog steeds gebeuren.

Wanneer het misgaat: twee ontwikkelaars passen dezelfde measure aan in fct_Verkopen.tmdl.

<<<<<<< HEAD
  measure 'Totale Omzet' =
    SUM(fct_Verkopen[Bedrag])
    formatString: #,##0.00
=======
  measure 'Totale Omzet' =
    SUMX(fct_Verkopen, fct_Verkopen[Aantal] * fct_Verkopen[Prijs])
    formatString: #,##0
>>>>>>> feature/omzet-herberekening

Omdat TMDL leesbare tekst is, kun je dit handmatig oplossen in VS Code of een andere editor. Kies de juiste versie, verwijder de conflict-markers, en commit het resultaat.

Tip: Open het model na het oplossen van een conflict altijd even in Power BI Desktop om te verifiëren dat het correct laadt. TMDL is gevoelig voor inspringing en syntax.

Conflicts voorkomen: werkafspraken

De beste manier om merge conflicts te voorkomen is goede afspraken:

CI/CD: automatisch deployen

Met Azure DevOps Pipelines kun je het deployment-proces automatiseren. Wanneer een pull request naar main wordt gemerged, kan een pipeline het model automatisch publiceren naar de Power BI Service.

Een basis YAML-pipeline:

trigger:
  branches:
    include:
      - main

pool:
  vmImage: 'windows-latest'

steps:
  - task: PowerShell@2
    displayName: 'Installeer Tabular Editor CLI'
    inputs:
      targetType: 'inline'
      script: |
        # Download Tabular Editor 2 portable (gratis, open source)
        Invoke-WebRequest -Uri "https://github.com/TabularEditor/TabularEditor/releases/latest/download/TabularEditor.Portable.zip" -OutFile "te2.zip"
        Expand-Archive -Path "te2.zip" -DestinationPath "$(Agent.ToolsDirectory)/TabularEditor"

  - task: PowerShell@2
    displayName: 'Deploy semantic model naar Power BI Service'
    inputs:
      targetType: 'inline'
      script: |
        $tePath = "$(Agent.ToolsDirectory)/TabularEditor/TabularEditor.exe"
        $modelPath = "$(Build.SourcesDirectory)/MijnProject.SemanticModel/definition"

        # Deploy via Tabular Editor CLI met service principal
        & $tePath `
          $modelPath `
          -S "powerbi://api.powerbi.com/v1.0/myorg/MijnWorkspace" `
          -D "SalesModel" `
          -U "app:$(SP_APP_ID)@$(TENANT_ID)" `
          -P "$(SP_SECRET)" `
          -O -C -R

Let op: Voor deployment via een service principal heb je een Microsoft Entra App Registration nodig met de juiste Power BI API-permissies. Sla credentials altijd op als pipeline-variabelen of in Azure Key Vault, nooit in de code zelf. Tabular Editor is de standaard tool voor TMDL-deployment.

Fabric Git Integration

Als je organisatie Microsoft Fabric gebruikt, is er een alternatief: Fabric Git Integration. Hiermee koppel je een Fabric workspace direct aan een Azure DevOps of GitHub repository. Wijzigingen in de workspace worden automatisch gesynchroniseerd met Git, en andersom.

Het voordeel: je hoeft niet lokaal te werken. Ontwikkelaars maken wijzigingen in de Fabric workspace, committen naar een branch, en openen een pull request -- alles vanuit de browser.

Het nadeel: je bent afhankelijk van de Fabric-omgeving en hebt minder controle over het lokale ontwikkelproces. Voor teams die gewend zijn aan lokaal werken in Desktop, is de .pbip + Git-aanpak vaak prettiger.

Recente ontwikkelingen

Het Power BI-ecosysteem rond .pbip en Git ontwikkelt zich snel. Een paar relevante updates:

Best practices

Veelgemaakte fouten

1. .pbix in Git zetten
Een binair bestand in Git is zinloos. Je krijgt geen diffs, geen merges, en je repo groeit snel naar gigabytes. Gebruik altijd .pbip.

2. Alles op main werken
Zonder branches verlies je het grootste voordeel van Git: parallel werken. Zelfs als je met twee mensen bent, gebruik branches en pull requests.

3. Credentials in de repo
Connection strings, API-keys en service principal secrets horen niet in Git. Gebruik Azure Key Vault of pipeline-variabelen.

4. Conflict-markers niet opruimen
Als je een merge conflict oplost maar de <<<<<< markers laat staan, kan Power BI Desktop het bestand niet openen. Controleer altijd of het model correct laadt na een merge.

5. Geen .gitignore
Zonder .gitignore komen lokale cache-bestanden en .pbix-backups in je repo terecht. Voeg de .gitignore toe voordat je je eerste commit maakt.

Hulp bij je Power BI architectuur?

YorrData helpt bij het inrichten van samenwerking op semantische modellen, van Git-setup en branching-strategie tot CI/CD pipelines en governance.

Neem contact op →

Gerelateerde artikelen

Wat is een semantisch model in Power BI? → Power BI governance: zo hou je grip op je BI-omgeving → Self-service BI inrichten: de balans tussen vrijheid en controle →

Hoe volwassen is jouw Power BI omgeving?

Doe de gratis scan en ontdek in 2 minuten hoe het staat met je architectuur, governance en meer.

Doe de gratis scan →