Before PBIP, "version-controlling a Power BI file" meant committing a binary .pbix. Diffs were useless; merges were impossible; code review was a screenshot exchange. PBIP solved this in 2024, and TMDL made it practical.

This guide walks through the setup, the daily workflow, and the two patterns that actually let more than one person edit a semantic model without losing work.

What PBIP and TMDL are

Folder layout:

my_report.pbip                     ← Open this from Power BI Desktop
my_report.Report/
  definition.pbir
  report.json
  visualContainers/...
my_report.SemanticModel/
  definition.pbism
  tables/
    fct_orders.tmdl
    dim_customers.tmdl
  relationships/
    relationships.tmdl
  measures/
    sales_metrics.tmdl
  roles/
    analyst.tmdl

Every file is plain text. Every change is a legible diff.

1. Set PBIP as the default save format

Power BI Desktop → File → Options → Preview features → enable Power BI Project (.pbip) save option.

Then save any existing .pbix as PBIP: Save As → Power BI project.

Important

Never commit .pbix files to Git again. Add *.pbix to .gitignore. A single accidental commit of a 200 MB binary bloats the repo forever. PBIP is the folder format; always save as PBIP for anything going into source control.

2. Default the SemanticModel to TMDL

PBIP saves the semantic model as TMDL when you enable Store semantic model using TMDL format in Power BI Desktop's preview features, or when you save from Tabular Editor 3 (which produces TMDL natively).

Verify: the .SemanticModel/ folder should contain .tmdl files, not a monolithic model.bim.

3. Commit the project

git add my_report.pbip my_report.SemanticModel/ my_report.Report/
git commit -m "feat(sales-model): add YoY revenue measure"

Reviews read the TMDL diff directly:

measure 'Revenue YoY' =
    VAR Current  = [Total Revenue]
    VAR Prior    = CALCULATE([Total Revenue], SAMEPERIODLASTYEAR('dim_date'[date]))
    RETURN
        DIVIDE(Current - Prior, Prior)
formatString: 0.00%;-0.00%;0%

No screenshots, no "trust me the measure is right", just DAX in version control.

4. The concurrent-editing problem

Power BI Desktop is not great at concurrent editing of the same semantic model. Two patterns work; the third does not.

Pattern A: domain-sliced ownership

Split one monolithic semantic model into multiple domain semantic models (sales, finance, inventory). Each has one owner. Merges within a domain are rare because only one person edits it.

Each owner has their own Git branch discipline; merges to main are surgical.

Pattern B: report-model separation

Report authors work on thin reports connected to a shared semantic model. They touch .Report/ files only.

One or two modelers own each shared semantic model. They work in Tabular Editor 3 (script-driven edits produce tiny TMDL diffs that are easy to review).

This way, report authors never touch the model, and the modeler ownership is narrow enough that merges are rare.

Pattern C (do not): shared semantic model, everyone edits

If five people open the same semantic model in Power BI Desktop and all push changes, you will have merge conflicts in TMDL that Power BI Desktop cannot resolve. Pattern A or B; pick one.

Warning

Merge conflicts in TMDL files are technically resolvable with care, but Power BI Desktop cannot reopen a conflicted TMDL file. If you hit a conflict, resolve it in a text editor, then verify by reopening in Desktop. The workflow is viable but friction-heavy; do not plan for it as the normal case.

5. Trunk-based development

Apply the same discipline you would to code:

6. PR review, the right way

Two things go wrong in Power BI PR review:

First, reviewers open the PBIP file in Desktop and "look at the report". This catches visual regressions but misses measure logic. The TMDL diff is the authoritative change record; read it.

Second, reviewers say "LGTM" on a measure change without running it. A measure that compiles may still produce the wrong number.

A practical review checklist:

7. Best Practice Analyzer as a PR gate

Tabular Editor's Best Practice Analyzer ships a strong default rule set. Typical rules enforce:

Extend the default rules with org-specific ones (naming conventions, banned functions, required descriptions). Run BPA in CI:

tabular-editor-cli.exe my_report.SemanticModel \
  -A "BPA Rules.json" \
  -V

PRs with open BPA violations fail the check.

8. Tools per role

RoleToolWhy
ModelerTabular Editor 3Script-driven edits; tiny TMDL diffs; BPA inline
Report authorPower BI Desktop, live connectionNo model surface to touch
ReviewerGit + text editor + Desktop for spot-checkRead the TMDL diff, not screenshots
CITabular Editor CLI + fabric-cicdBPA gate + deploy

Tip

Modelers move to Tabular Editor 3 for a reason: one script can add five measures at once, in a single reviewable commit. Power BI Desktop's click-to-add-measure workflow produces five commits for the same work. If you are maintaining a shared semantic model for a team, the investment in TE3 pays back in the first quarter.

Common mistakes

SymptomRoot cause
Merge conflicts on monolithic model.bimNot using TMDL. Enable it in preview features.
.pbix files accidentally committedMissing .gitignore. Add *.pbix.
PR diff is unreadableModel saved as TMDL, but reviewers are opening Desktop instead of reading TMDL.
Changes lost between two developersPattern C (everyone editing the same model). Split to pattern A or B.
BPA violations accumulateNo CI gate. Add one; fail the build.

See also