Business Professionals
Power BI | Power Pivot | Power Query | DAX
Cloud Flows | RPA | AI Builder | Copilot
60+ Formulas | Data Stories | Advanced Reporting & Modeling
VB Programming | Report Automation |
MS-Office Automation
Techno-Business Professionals
Power BI | Power Query | Advanced DAX | SQL - Query &
Programming
Microsoft Fabric | Power BI | Power Query | Advanced DAX |
SQL - Query & Programming
Power BI | Power Apps | Power Automate | Copilot Studio | Power Pages | Dataverse
Microsoft Power Apps | Microsoft Power Automate
Power BI | Adv. DAX | SQL (Query & Programming) |
VBA | Python | Web Scrapping | API Integration
Power BI | Power Apps | Power Automate |
SQL (Query & Programming)
Power BI | Adv. DAX | Power Apps | Power Automate |
SQL (Query & Programming) | VBA | Python | Web Scrapping | API Integration
Power Apps | Power Automate | SQL | VBA | Python |
Web Scraping | RPA | API Integration
Technology Professionals
Power BI | DAX | SQL | ETL with SSIS | SSAS | VBA | Python
Power BI | SQL | Azure Data Lake | Synapse Analytics |
Data Factory | Databricks | Power Apps | Power Automate |
Azure Analysis Services
Microsoft Fabric | Power BI | SQL | Lakehouse |
Data Factory (Pipelines) | Dataflows Gen2 | KQL | Delta Tables | Power Apps | Power Automate
Power BI | Power Apps | Power Automate | SQL | VBA | Python | API Integration
Power BI | Advanced DAX | Databricks | SQL | Lakehouse Architecture
Business Professionals
Power BI | Power Pivot | Power Query | DAX
Cloud Flows | RPA | AI Builder | Copilot
60+ Formulas | Data Stories | Advanced Reporting & Modeling
VB Programming | Report Automation |
MS-Office Automation
Techno-Business Professionals
Power BI | Power Query | Advanced DAX | SQL - Query &
Programming
Microsoft Fabric | Power BI | Power Query | Advanced DAX |
SQL - Query & Programming
Power BI | Power Apps | Power Automate | Copilot Studio | Power Pages | Dataverse
Microsoft Power Apps | Microsoft Power Automate
Power BI | Adv. DAX | SQL (Query & Programming) |
VBA | Web Scrapping | API Integration
Power BI | Power Apps | Power Automate |
SQL (Query & Programming)
Power BI | Adv. DAX | Power Apps | Power Automate |
SQL (Query & Programming) | VBA | Web Scrapping | API Integration
Power Apps | Power Automate | SQL | VBA |
Web Scraping | RPA | API Integration
Technology Professionals
Power BI | DAX | SQL | ETL with SSIS | SSAS | VBA
Power BI | SQL | Azure Data Lake | Synapse Analytics |
Data Factory | Azure Analysis Services
Microsoft Fabric | Power BI | SQL | Lakehouse |
Data Factory (Pipelines) | Dataflows Gen2 | KQL | Delta Tables
Power BI | Power Apps | Power Automate | SQL | VBA | API Integration
Power BI | Advanced DAX | Databricks | SQL | Lakehouse Architecture
Your team just enabled Power BI Git integration, two developers grab the same report, and an hour later one of them pushes changes that seem to wipe out the other’s work. The UI says “merge conflict”, but what’s actually conflicting, and what survives?
This post walks through what happens under the hood when multiple people edit the same Power BI report with Git, how conflicts show up, and a practical workflow to avoid losing work.
You’re in a BI team supporting a regional sales organisation.
SalesModel in a shared workspaceSales Performance.pbip (Git-connected workspace)On Monday morning:
Executive Overview page.Both pull the latest from the main branch, both open the report in Power BI Service (or Desktop with Git), both start changing things.
At 11:00, Dev B saves and commits. At 11:10, Dev A tries to commit and suddenly sees conflicts.
Let’s unpack what’s actually happening.
When you connect a workspace to a Git repo and turn on “Store artifacts in Git”, a report is no longer just a .pbix blob.
A Power BI Project (.pbip) is a folder structure, typically like this:
Sales Performance
├─ Sales Performance.pbip
├─ definition.pbir # Report definition (pages, visuals, layout)
├─ connections.json # Dataset connection info
└─ semanticModel
├─ model.bim # Tabular model (tables, relationships, measures)
└─ partitions.json # Partition definitions
``
Key points:
- **Report visuals and pages** live in `definition.pbir`.
- **Model, measures, relationships** live in `model.bim`.
- **Git** tracks these as plain text files (JSON / TOM-like).
So when two people “edit the same report”, they might be touching:
- The same file (e.g. both editing `definition.pbir`), or
- Different files (e.g. visuals vs measures) that Git can merge more safely.
---
## What “Editing the Same Report” Actually Means in Git Terms
Back to our scenario.
- Dev A:
- Changes the layout of `Executive Overview`.
- Renames a visual and updates its filters.
- All of this lives in `definition.pbir`.
- Dev B:
- Refactors `[Total Sales]` and `[Sales LY]` measures.
- Adds `[Sales Growth %]`.
- This lives in `semanticModel/model.bim`.
If they only touch those separate files, Git can usually auto-merge:
1. Dev B commits first.
2. Dev A pulls, gets Dev B’s changes.
3. Dev A’s local repo now has updated `model.bim` plus her own `definition.pbir` changes.
4. Dev A commits; Git sees different files changed and merges cleanly.
**Conflict risk is low** when:
- One person edits visuals only.
- Another edits measures/model only.
The trouble starts when both devs touch the same file.
---
## When Conflicts Happen: The Three Common Collision Points
### 1. Both Change the Same Measure
Dev A decides to tweak the tooltip measure `[Total Sales]` for a card visual.
Dev B is refactoring the same `[Total Sales]` measure for performance.
Under the hood, `model.bim` might have a block like this (simplified):
```json
{
"name": "Total Sales",
"expression": "CALCULATE(SUM('Sales'[Amount]))"
}
Dev B changes it to:
Total Sales =
CALCULATE(
SUM('Sales'[Amount]),
KEEPFILTERS('Sales'[Status] <> "Cancelled")
)
Dev A changes it to:
Total Sales =
VAR BaseSales = SUM('Sales'[Amount])
RETURN
IF(BaseSales < 0, 0, BaseSales)
Both edits land in the same JSON node in model.bim. When the second developer pushes, Git sees a line-level conflict.
Result:
Dev A repositions a clustered column chart and changes its title.
Dev B edits the same chart’s field well (e.g. adds a legend field) while testing a new measure.
Internally, a visual in definition.pbir is a JSON object. Both devs update different properties of the same visual, but often within the same JSON block.
If their changes touch overlapping lines, Git can’t automatically decide which version to keep.
Result:
definition.pbir.Examples:
These all live in model.bim. If two devs touch the same object, you get another text-level conflict.
Depending on your workflow, you’ll hit conflicts in slightly different places.
Typical flow:
The conflict resolution is not done in the visual editor. You need to:
Flow:
git clone)..pbip in Power BI Desktop.git pull before git push.If someone else pushed changes:
git pull tries to merge.model.bim or definition.pbir.Conflict markers look like this:
<<<<<<< HEAD
"expression": "Total Sales = VAR BaseSales = SUM('Sales'[Amount]) RETURN IF(BaseSales < 0, 0, BaseSales)"
=======
"expression": "Total Sales = CALCULATE(SUM('Sales'[Amount]), KEEPFILTERS('Sales'[Status] <> \"Cancelled\"))"
>>>>>>> origin/main
You need to keep one version or manually combine them.
The goal isn’t to avoid conflicts completely (that’s impossible in real teams), but to make them rare and easy to resolve.
Here’s a practical pattern for our Sales team.
mainFor any non-trivial change:
git checkout -b feature/executive-overview-layout
Benefits:
model.bim and definition.pbir before merging.Reduce overlapping edits by splitting responsibility:
Executive Overview.Practical rules:
This keeps most changes in separate files (definition.pbir vs model.bim).
In our scenario, both devs pulled in the morning and then worked for hours.
Better habit:
git pull (or sync in your Git client) before opening the .pbip to start a new change session.This keeps your local copy closer to the remote and reduces conflict scope.
Compare these two commit styles:
Small, focused commits:
Model changes (model.bim) can have wide impact.
For branches that touch the model:
You can even copy DAX from the diff into Desktop to test.
Let’s walk a concrete resolution for our Sales team.
Situation:
[Total Sales] measure.[Total Sales].model.bim.Steps:
[Total Sales] object.Total Sales =
VAR BaseSales =
CALCULATE(
SUM('Sales'[Amount]),
KEEPFILTERS('Sales'[Status] <> "Cancelled")
)
RETURN
IF(BaseSales < 0, 0, BaseSales)
<<<<<<<, =======, >>>>>>> lines.git add semanticModel/model.bim
git commit -m "Resolve conflict for Total Sales measure"
.pbip in Desktop or Service to validate:
[Total Sales].This is tedious the first time, but once you’ve done it a few times it becomes routine.
There are still cases where parallel editing is more pain than it’s worth.
Consider locking or informal coordination when:
Tactics:
SalesModel today – please don’t touch measures in that model until tomorrow.”Git can help, but it can’t stop two people from stepping on each other if they coordinate poorly.
Before your next sprint, pick one important report and agree on a simple rule: visual changes and model changes must go through separate feature branches. That single habit drastically reduces painful merge conflicts when two people edit the same Power BI report and makes your Git history readable when you have to debug a broken metric three months from now.
This article reflects how Power BI Git integration changes day-to-day collaboration on shared reports, especially for BI teams moving from single-owner .pbix files to multi-developer workflows with branching and code review.
Professionals who want to apply these patterns to their own data can explore Excelgoodies' Power BI Reporting programme - taught live by instructors, with certification awarded once a real project is running at work.
Insights compiled through ongoing industry research and discussions within the Excelgoodies Analytics Community.
Power BI
New
Next Batches Now Live
Power BI
SQL
Power Apps
Power Automate
Microsoft Fabrics
Azure Data Engineering