{"id":100615,"date":"2023-11-22T19:41:22","date_gmt":"2023-11-22T19:41:22","guid":{"rendered":"https:\/\/www.red-gate.com\/simple-talk\/?p=100615"},"modified":"2023-11-22T21:33:29","modified_gmt":"2023-11-22T21:33:29","slug":"source-control-with-git-power-bi-and-microsoft-fabric","status":"publish","type":"post","link":"https:\/\/www.red-gate.com\/simple-talk\/databases\/sql-server\/bi-sql-server\/source-control-with-git-power-bi-and-microsoft-fabric\/","title":{"rendered":"Source Control with GIT, Power BI and Microsoft Fabric"},"content":{"rendered":"<p>Source control is fundamental when dealing with projects and sharing code between multiple developers.<\/p>\n<p>Power BI present some challenges related to source control. But it\u2019s finally providing us with a solution to these challenges. Let\u2019s analyse this piece-by-piece. According to your previous knowledge, you may would like to skip some section of this article. This is the structure I will use:<\/p>\n<ul>\n<li>Process Planning: The beginning<\/li>\n<li>The current challenges between source control and Power BI<\/li>\n<li>GIT 101<\/li>\n<li>Sample repository<\/li>\n<li>The new features related to source control and Power BI<\/li>\n<li>Process Planning: What more we can do<\/li>\n<\/ul>\n<p><em>Note: Sections with a prefix of TODO are sections you can execute, in the middle of sections with concept explanations. The steps are numbered consistently throughout the steps.<\/em><\/p>\n<p>According to your previous knowledge about GIT, you can choose to skip some of the sections of the article.<\/p>\n<h2>Pre-Requisites<\/h2>\n<ul>\n<li>Have GIT Bash installed to follow the sample. You can download from <a href=\"https:\/\/git-scm.com\/downloads\">this link<\/a><\/li>\n<li>Visual Studio Code installed to follow some of the samples. You can download from <a href=\"https:\/\/code.visualstudio.com\/download\">this link<\/a>.<\/li>\n<li>A GIT compatible repository, we recommend Azure Devops. You can follow <a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/devops\/repos\/git\/create-new-repo?view=azure-devops\">these steps<\/a><\/li>\n<li>A Power BI file, with data and report<\/li>\n<\/ul>\n<h2>Process Planning and possibilities<\/h2>\n<p>The development of the BI reports requires a development process, in a similar way as regular software development. The development process requires at least 3 environments:<\/p>\n<ul>\n<li>Development environment<\/li>\n<li>Test Environment<\/li>\n<li>Production Environment<\/li>\n<\/ul>\n<p>We need a process to coordinate the evolution of the source code produced between the environments: From Development to Test, from Test to Production.<\/p>\n<p>Before source control, <strong>Power BI<\/strong> already had the development pipelines for this purpose. The movement of the reports from one environment to the other can be done manually in the portal or automatically using Azure DevOps.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"641\" height=\"337\" class=\"wp-image-100657\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/everything-you-must-know-before-getting-started-wi-2.png\" alt=\"Everything you must know before getting started with deployment pipelines\" \/><\/p>\n<p>I have a video on YouTube that you can watch if you want to learn more about <a href=\"https:\/\/www.youtube.com\/watch?v=GRm8cQuQcZg&amp;list=PLNbt9tnNIlQ5pVwZFRVpoBG8uQTs8aIcz\">how to use the deployment pipelines<\/a><\/p>\n<p>The challenge we have is to design a new process including the source control features and deciding what is the best option for each scenario.<\/p>\n<p>Let\u2019s consider 3 possibilities:<\/p>\n<ul>\n<li>Use source control together Deployment Pipelines<\/li>\n<li>User source control without Deployment Pipelines<\/li>\n<li>Use source control with a single developer<\/li>\n<\/ul>\n<p>Below I explain these 3 scenarios. Could you imagine additional ones? Let\u2019s talk about it in the comments.<\/p>\n<h3>Use source control together Deployment Pipelines<\/h3>\n<p>In this scenario, the deployment pipelines are the responsible to move the product between environments.<\/p>\n<p>The <strong>Development<\/strong> environment needs to be linked to a repository, but the <strong>Test<\/strong> and <strong>Production <\/strong>environment have no need of a repository. The movement from Dev to Test and then to Production will be responsibility of the deployment pipelines.<\/p>\n<p>This scenario ends up being like the <strong>Data Factory<\/strong> and <strong>Azure Synapse<\/strong> source control: only the Development environment requires a repository, the upper environments don\u2019t need one.<\/p>\n<h3>Next Steps<\/h3>\n<p>Let\u2019s understand the technical features <strong>Power BI<\/strong> offers for source control first, so we can analyse deeply the additional architectural options.<\/p>\n<h2>Power BI and Source Control: The current challenges<\/h2>\n<p>These are the current challenges to using Power BI in a source control scenario:<\/p>\n<ul>\n<li><strong>Power BI files have binary content<br \/>\n<\/strong>The binary content doesn\u2019t work so well with source control. The main purpose of the source control is to allow developers to work on the files an make it possible to merge the results. Using a binary file, this is not possible.<\/li>\n<li><strong> Power BI files contain data<\/strong><br \/>\nThe <code>PBIX<\/code> file contains the data gathered during the dataset refresh. Usually, we don\u2019t want to send data to source control, we send only text files we can compare to find the differences implemented by the developer.<\/li>\n<\/ul>\n<p>In fact, the original <code>PBIX<\/code> file is a .<code>ZIP<\/code> file with a different extension. If you rename the file as .<code>ZIP<\/code> and open it, you can see the individual files. However, they don\u2019t have extensions and are not built with source control in mind.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"237\" height=\"244\" class=\"wp-image-100659\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-97.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/p>\n<h2>GIT Basic Concepts<\/h2>\n<p>The image below summarizes most GIT concepts you need to know to make a good use of source control in Power BI<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"1362\" height=\"743\" class=\"wp-image-100661\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/word-image-100615-3-1.png\" \/><\/p>\n<p>The following list summarizes at a high level, the process to using GIT to source control your files.<\/p>\n<ol>\n<li>The remote repository is <strong>CLONED<\/strong> to the local machine. The clone becomes a folder in the local machine. This folder is configured as a local repository.<br \/>\nAll the existing branches in the moment of the <strong>CLONE<\/strong> are created in the local repository. If the Branch B is created later, the local repository will not have the Branch B included.<\/li>\n<li>A <strong>FETCH<\/strong> operation can be triggered by the local repository. The fetch brings to the local repository the knowledge of existence of new branches on the server.<\/li>\n<li>A <strong>CHECKOUT<\/strong> operation can be done to change the current branch to another one. <br \/>\nEach branch has different versions of the files. A <strong>CHECKOUT<\/strong> operation replaces the files in the repository folder by the version contained in the branch. In this way you can work in different versions at any moment. You only need to <strong>CHECKOUT<\/strong> the branch you would like to work with.<br \/>\nThe <strong>CHECKOUT<\/strong> process can generate different results:<\/p>\n<ol>\n<li>Change a local branch by another local branch<\/li>\n<li>Retrieve a remote branch to the local repository<\/li>\n<li>Create a new branch<\/li>\n<\/ol>\n<\/li>\n<li>When you update the files in the local repository, you need to create a <strong>COMMIT<\/strong>. Basically, it means packing your changes together to be sent to the remote repository.<\/li>\n<li>Once the local development is completed, the commits need to be <strong>PUSHED<\/strong> to the remote repository, updating the remote branch. On the image above, the Branch B is updated.<\/li>\n<li>Branch B and Branch A have two different versions of the project in the remote repository. The versions need to be synchronized.\n<p>The synchronization process involves a request, which is called <code>PULL REQUEST<\/code>. This happens because there are multiple possible scenarios. Here are some of the possible scenarios:<\/p>\n<ol>\n<li>The branches may be created by different developers. One developer may need to approve what the other developer produced<\/li>\n<li>The target branch may be a test or production environment and the process involves publishing to a new environment. In some cases, may even include CI\/CD process.<\/li>\n<li>The procedure may include a code review. The <code>PULL REQUEST<\/code> may be subject to approval by other developers or the team leader.<\/li>\n<\/ol>\n<\/li>\n<li>After the <code>PULL REQUEST<\/code>, the <code>Branch A<\/code> on the server repository is more updated than the <code>Branch A<\/code> in the local repository. The developer needs to execute a <code>PULL<\/code> from the server to the local repository to update the local branch.<\/li>\n<\/ol>\n<h2>TODO: Save a Power BI Project<\/h2>\n<p>The Power BI Project is a preview feature. Before we can use it, we need to enable the feature. Once in Power BI, use <em>File -&gt; Options and Settings -&gt; Options -&gt; Preview Features<\/em> and enable the <em>Power BI Project (.pbip) save option<\/em><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"1022\" height=\"818\" class=\"wp-image-100664\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-99.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/p>\n<ol>\n<li>Create a folder to be your local repository<\/li>\n<li>Open your sample Power BI file (<code>PBIX<\/code>)<\/li>\n<li>Save the project using File-&gt; Save As<\/li>\n<li>Click Browse this device to choose the correct folder<\/li>\n<li>Change the file type to <code>PBIP<\/code><\/li>\n<\/ol>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"852\" height=\"514\" class=\"wp-image-100666\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-101.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/p>\n<ol start=\"6\">\n<li>Save the file<\/li>\n<\/ol>\n<h2>The Power BI Project<\/h2>\n<p>The Power BI Project File, <code>PBIP<\/code>, is not a single file by itself. When we save a <code>PBIP<\/code>, the content of the Power BI file is broken down in many different files.<\/p>\n<p>The main points related to the files created by the Power BI project are the following:<\/p>\n<ul>\n<li>The PBIP file is created in the root of the folder<\/li>\n<li>Two subfolders are created, one for the reports and one for the dataset<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"208\" height=\"225\" class=\"wp-image-100668\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/word-image-100615-6-1.png\" \/><\/p>\n<ul>\n<li>For each folder, dataset and report, a file <code>item.config.json<\/code> and a file <code>item.metadata.config<\/code> are created. This file is used by Power BI to identify the content of the folder as a single object (a single dataset or a single report).<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"232\" height=\"223\" class=\"wp-image-100670\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-103.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/p>\n<ul>\n<li>Both folders contain a subfolder called <em>\u201c<\/em><code>.PBI<\/code><em>\u201d<\/em>. This folder is intended to contain files intended to be local, not included in the remote repository.<\/li>\n<li>The <em>\u201c<\/em><code>.PBI<\/code><em>\u201d<\/em> folder inside the dataset folder contains a file called <code>cache.abf<\/code>. This file contains all the data generated by dataset refreshes. In this way, the data is never uploaded to the repository, only the object definitions.<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"263\" height=\"178\" class=\"wp-image-100671\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-104.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/p>\n<ul>\n<li>A <code>.gitignore<\/code> file is created in the root folder. It ignores the <em>\u201c<\/em><code>.PBI<\/code><em>\u201d<\/em> folders, which makes them local files (that will not be version controlled).<\/li>\n<li>The report definition is saved in a file called <code>report.json<\/code>. As a JSON file, it becomes easier to make merges when two developers work on the same report at the same time.<\/li>\n<li>The dataset definition is stored in a file called <code>model.bim<\/code>, also in JSON format to help concurrent work.<\/li>\n<\/ul>\n<p>It\u2019s also possible to save multiple PBIP files in the same folder. The files keep a reference with each other and the folders, not allowing the objects to be mixed<\/p>\n<h2>TODO: Initialize the local Repository and link to the remote one<\/h2>\n<p>This step needs to be taken after your remote repository is ready. In this example, I will use GIT BASH, a command line tool. This is GIT 101, you can do this step with different tools and skip this section if you already have this knowledge.<\/p>\n<p>This continues on the steps taken in the previous TODO section.<\/p>\n<ol start=\"7\">\n<li>Open git bash\n<p>Change the current folder to the folder with the <code>PBIP<\/code> files<\/li>\n<li>Use <code>CD C:\/repos\/Adventure<\/code> for this (the path is an example, of course).<\/li>\n<li>Use <code>GIT INIT<\/code><br \/>\nThis statement initializes the folder as a local repository, creating the special git file on the folder <em>\u201c.GIT\u201d<\/em><\/li>\n<li>Use <code>GIT ADD<\/code> .<\/li>\n<li><code>GIT ADD<\/code> includes files to be tracked by GIT. The \u201c.\u201d Is telling to include everything, including subfolders. The files will be considered new files, not committed yet.<\/li>\n<li>Use <code>GIT COMMIT \u2013m<\/code> \u201cFirst Commit\u201d<br \/>\nWe are committing the files we just added to the local repository, including a commit message.<br \/>\nAt this point, the local repository is created and has its first commit, but it\u2019s not linked to the remote repository yet.<\/li>\n<li>Use <code>GIT REMOTE ADD ORIGIN &lt;&lt;your remote repository&gt;&gt;<\/code><br \/>\n\u201cORIGIN\u201d is not a statement, rather it is the name given to the remote repository. It\u2019s very common to use \u201corigin\u201d, because usually we have only one. But you can use any name you would like.<\/li>\n<li>Use <code>GIT FETCH<\/code><br \/>\nThe local repository needs to discover what branches exist remotely before we link local branches with remote branches<\/li>\n<li>Use <code>GIT BRANCH \u2013SET-UPSTREAM-TO=ORIGIN\/MAIN<\/code><br \/>\nThis links the local current branch (usually <code>MAIN<\/code>) to the remote <code>MAIN<\/code> branch.<br \/>\nThe remote repository usually already has at least a <code>README<\/code> file. The local repository has the initial commit with our Power BI project. This means the repositories have a different history. This history needs to be synchronized. We will use the next three commands to synchronize the remote history with the local history.<\/li>\n<li>Use <code>GIT REBASE<\/code><\/li>\n<li>Use <code>GIT PUSH<\/code><\/li>\n<\/ol>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"850\" height=\"1037\" class=\"wp-image-100672\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-computer-screen-shot-of-a-program-description-a-2.png\" alt=\"A computer screen shot of a program\n\nDescription automatically generated\" \/><\/p>\n<p>The image below is the repository on Azure Devops after the last <strong>GIT PUSH<\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"1002\" height=\"332\" class=\"wp-image-100673\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-105.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/p>\n<h2>TODO: Link the Power BI Workspace with the repository<\/h2>\n<p>Power BI will get the files from the workspace. We need to link a repository to the workspace. It\u2019s interesting how this new process will make the publish from the power bi desktop redundant.<\/p>\n<ol start=\"18\">\n<li>Create a workspace, if you don\u2019t have one for this purpose yet<\/li>\n<li>Click Workspace Settings<\/li>\n<li>On WorkSpace Settings window, click GIT Integration<\/li>\n<li>On <em>Organization<\/em> dropdown, select your organization. Your <strong>Power BI<\/strong> account needs access to your repository<\/li>\n<li>On <em>Project<\/em> dropdown, select the project. <strong>Power BI<\/strong> will show the projects you have access to.<\/li>\n<li>On <em>GIT Repository<\/em> dropdown, select the name of the repository<\/li>\n<li>On <em>Branch<\/em> dropdown, select the name of the branch. The branch is the only setting you can change later without disconnecting from the repository.<\/li>\n<li>On <em>GIT Folder<\/em> textbox, type <em>\u201c\/\u201d <\/em>. We will link the workspace with the root folder. Different folders in the repository, including subfolders, will be ignored.<\/li>\n<\/ol>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"822\" height=\"688\" class=\"wp-image-100674\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-106.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/p>\n<ol start=\"26\">\n<li>Click the button <em>Connect &amp; Sync\n<p><\/em>After syncing for a while, you will be able to see the files in the repository. Note that the Power BI <em>Publish<\/em> command was not used. There is a good potential for the Publish command to become redundant.<br \/>\n<img loading=\"lazy\" decoding=\"async\" width=\"332\" height=\"90\" class=\"wp-image-100675\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-107.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/li>\n<\/ol>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"1364\" height=\"311\" class=\"wp-image-100676\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-108.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/p>\n<ol start=\"27\">\n<li>Open the report\n<p>There is no data on the report. This illustrates how the data from the <strong>Power BI Desktop<\/strong> is never uploaded to the repository and doesn\u2019t reach the portal.<br \/>\n<img loading=\"lazy\" decoding=\"async\" width=\"249\" height=\"142\" class=\"wp-image-100677\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-close-up-of-a-logo-description-automatically-ge-2.png\" alt=\"A close up of a logo\n\nDescription automatically generated\" \/><\/li>\n<li>On the Dataset, click the Expand button =&gt; Settings<\/li>\n<\/ol>\n<p><em><img loading=\"lazy\" decoding=\"async\" width=\"662\" height=\"527\" class=\"wp-image-100678\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-109.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/em><\/p>\n<ol start=\"29\">\n<li>Under <em>Data Source Credential<\/em>, click <em>Edit Credentials<\/em> in the image below to fix the dataset credentials. You may notice the error message complaining about the credentials.<\/li>\n<\/ol>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"548\" class=\"wp-image-100679\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-110.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/p>\n<ol>\n<li>Back to the workspace, click the <em>Refresh<\/em> Now button.<\/li>\n<li>When the refresh is complete, open the report again.<\/li>\n<\/ol>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"217\" height=\"106\" class=\"wp-image-100680\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-number-with-black-text-description-automaticall-4.png\" alt=\"A number with black text\n\nDescription automatically generated with medium confidence\" \/><\/p>\n<h2>Considerations about the link between the Workspace and the Repository<\/h2>\n<p>The folder is one of the key values we need to choose when linking the workspace with the source control. Choosing a folder is a difference between linking the workspace to the entire repository or with one specific folder of the repository. This brings many different process options to be chosen on the correct situation:<\/p>\n<ul>\n<li>We can have a repository containing a bigger data engineering project, where the power bi workspace is only a piece of the project, contained in one of the folders.<\/li>\n<li>We can have a single repository containing multiple workspaces, each workspace in a different folder.<\/li>\n<li>We can have one repository for each workspace, linking the workspace with the root folder<\/li>\n<\/ul>\n<p><em>Can you think about more possibilities? Tell me in the comments.<\/em><\/p>\n<p>Once we define a process to work with source control, the <strong>Publish<\/strong> from <strong>Power BI Desktop<\/strong> will not need happen anymore. We will only need to push to a repository and the repository linked to the workspace. The portal will synchronize with the repository.<\/p>\n<p>When you open the report, you will notice it\u2019s completely empty. The data was never published to the repository. In this way, the reports appear empty until we make the first dataset refresh.<\/p>\n<p>Even so, the data will not be published to the repository. You may remind the PBIP generation created a <em>.GitIgnore<\/em> file which excludes the data. In this way, the dataset refreshes are independent of the source control and branch checkouts. We will see more demonstrations of this further in this article.<\/p>\n<h2>Workspace and Source Control: Technical Features<\/h2>\n<p>The user can see, use and change the integration with the source control on the following ways:<\/p>\n<ul>\n<li>Status column in the list of objects<\/li>\n<li>Source Control button on top of the screen<\/li>\n<li>Workspace Settings-&gt; Git Configuration<\/li>\n<\/ul>\n<h3>Status column<\/h3>\n<p>The status column points how the object is in relation to the source control. There are some examples ahead on the article. The status column can have the following values:<\/p>\n<ul>\n<li><strong>Synced:<\/strong> The file is in sync, nothing is needed.<\/li>\n<li><strong>Update:<\/strong> The file is updated on the repository. Someone pushed changes to the repository. A pull is needed on the workspace.<\/li>\n<li><strong>Uncommitted:<\/strong> The file was updated on the portal. Someone opened a report, for example, and changed it on the portal. A commit is required.<\/li>\n<li><strong>Conflict:<\/strong> Someone pushed new changes to the repository, but at the same time there were changes on the portal as well, creating a conflict. A merge process is needed when pushing to the repository.<\/li>\n<li><strong>Item Identical:<\/strong> The item is the same on the workspace and on the repository, but the commits don\u2019t match.<\/li>\n<li><strong>Unsupported:<\/strong> The item is unsupported. As a result, It\u2019s independent of the link to the source control, doesn\u2019t change together the branches.<\/li>\n<\/ul>\n<h3>Source Control Button<\/h3>\n<p>Using the <em>Source Control<\/em> button, on the top of the <strong>Power BI<\/strong> portal, you can execute the following tasks:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"183\" height=\"45\" class=\"wp-image-100681\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/word-image-100615-18-1.png\" \/><\/p>\n<ul>\n<li><strong>Pull:<\/strong> When the files are with \u201cUpdate\u201d status, you would like to pull them from the repository<\/li>\n<li><strong>Uncommitted:<\/strong> When the files are on the \u201cUncommitted\u201d status, you would like to commit them. Usually, the commit is to a local repository, but on the portal, \u201cCommit\u201d means Commit + Push<\/li>\n<li><strong>Conflict:<\/strong> When the files are in Conflict state, you can make the merge using the Source Control button<\/li>\n<li><strong>Item Identical:<\/strong> Using the source control button, we can make a pull to fix the commit history<\/li>\n<li><strong>Branch Checkout:<\/strong> It\u2019s important to notice there is a small name mistake here. Branch checkout usually means any change of branch. But for the Source Control button, it only means the creation of a new branch. This button is not capable to checkout an existing branch.<\/li>\n<\/ul>\n<h3>Workspace Settings-&gt; Git Configuration<\/h3>\n<p>After the workspace is linked to the source control, the Git Configuration allow us to make a branch checkout to a different existing branch.<\/p>\n<p>Mind the difference: The source control button makes a branch checkout creating a new branch, while the git configuration makes a branch checkout to an existing branch.<\/p>\n<p>Whether and when you would allow or not the developers to use the git checkout feature is something to be analysed as part of the source control process to be used.<\/p>\n<p><strong><em>The decision depends on one technical behavior: The workspace branch checkout is global, is not a user configuration. Once a different or new branch is checked out, it is for all users. All the developers need to agree about which branch the workspace will be working with.<\/em><\/strong><\/p>\n<p>It\u2019s also important to notice we can only make checkout of a different branch; we can\u2019t change the folder linked to the repository. The folder could only be changed by breaking the link with the source control and linking again, a process you wouldn\u2019t like to do so often. In this way, you should choose the folder wisely.<\/p>\n<h2>TODO: Creating a new Branch and Fetching on the Client<\/h2>\n<ol start=\"32\">\n<li>Click the <em>Source Control <\/em>button<br \/>\n<img loading=\"lazy\" decoding=\"async\" width=\"183\" height=\"45\" class=\"wp-image-100682\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/word-image-100615-19-1.png\" \/><\/li>\n<li>On the <em>Source Control<\/em> window, open the branch dropdown<br \/>\nOn the <em>Source Control<\/em> window, you can\u2019t change to an existing branch, you can only create a new branch. <strong>CHECKOUT<\/strong> has multiple meanings. In this case it means only creating a new branch.<\/li>\n<li>Click the option <code>Checkout New Branch<\/code><br \/>\n<img loading=\"lazy\" decoding=\"async\" width=\"344\" height=\"158\" class=\"wp-image-100683\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-111.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/li>\n<li>On the <em>Checkout Branch<\/em> window, type the name of the new branch <em>\u201cBranch B\u201d<br \/>\n<\/em><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"289\" class=\"wp-image-100684\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-checkout-branch-description-aut-3.png\" alt=\"A screenshot of a checkout branch\n\nDescription automatically generated\" \/><\/li>\n<li>Click the button <em>Checkout Branch<\/em>.<\/li>\n<li>This will create the <em>\u201cBranch B\u201d<\/em> based on the Main branch<br \/>\nTake a look on the Azure DevOps, the new branch will be on the server repository.<\/li>\n<\/ol>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"488\" height=\"243\" class=\"wp-image-100685\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-112.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/p>\n<h2>TODO: Use Visual Studio Code to change your new branch<\/h2>\n<p><strong>Visual Studio Code<\/strong> is your friend. If you don\u2019t want to manage the repository using command line, visual studio code is a good option.<\/p>\n<ol start=\"38\">\n<li>Open <strong>Visual Studio Code<\/strong><\/li>\n<li>Click on <em>File -&gt; Open Folder<\/em> on the top menu<\/li>\n<li>Open the local repository folder<br \/>\n<img loading=\"lazy\" decoding=\"async\" width=\"220\" height=\"221\" class=\"wp-image-100686\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-113.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/li>\n<li>On the status line, click the <em>\u201cmain\u201d<\/em>, the name of the branch<br \/>\n<img loading=\"lazy\" decoding=\"async\" width=\"198\" height=\"29\" class=\"wp-image-100687\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/word-image-100615-24-1.png\" \/><br \/>\nYou will be able to see the main branch, but not Branch B. This happens because the Branch B was created on the server repository. The local repository doesn\u2019t know this branch yet. We need to execute a Fetch.<br \/>\n<img loading=\"lazy\" decoding=\"async\" width=\"267\" height=\"153\" class=\"wp-image-100688\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-114.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/li>\n<li>Click on the <em>Source Control<\/em> button on the left toolbar<br \/>\n<img loading=\"lazy\" decoding=\"async\" width=\"55\" height=\"377\" class=\"wp-image-100689\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-black-rectangular-object-with-a-red-border-desc-2.png\" alt=\"A black rectangular object with a red border\n\nDescription automatically generated\" \/><\/li>\n<li>On the <em>Source Control<\/em> window, click the expand button <em>\u201c&#8230;\u201d<\/em><\/li>\n<li>On the menu, click <strong>Fetch<br \/>\n<\/strong><img loading=\"lazy\" decoding=\"async\" width=\"299\" height=\"472\" class=\"wp-image-100690\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-115.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/li>\n<li>Click Main on the status bar<br \/>\nThe local repository knows the Branch B exists<br \/>\n<img loading=\"lazy\" decoding=\"async\" width=\"288\" height=\"179\" class=\"wp-image-100691\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-116.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/li>\n<li>Select the Branch B on the pallet above<br \/>\nThis will make a branch <strong>CHECKOUT<\/strong>, we will be changing the local files from Main to Branch B.<\/li>\n<\/ol>\n<h3>Making a change on Branch B<\/h3>\n<ol start=\"47\">\n<li>Open Power BI<\/li>\n<li>Open the PBIP file<\/li>\n<li>From the table <code>Products<\/code>, select <code>ProductCategoryName<\/code> to create a new visual<\/li>\n<li>From <code>TransactionHistory<\/code> table, select <code>ActualCost<\/code> field<br \/>\n<img loading=\"lazy\" decoding=\"async\" width=\"181\" height=\"469\" class=\"wp-image-100692\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-screen-description-aut-2.png\" alt=\"A screenshot of a computer screen\n\nDescription automatically generated\" \/><\/li>\n<li>Resize the visual to cover half of the report page<br \/>\n<img loading=\"lazy\" decoding=\"async\" width=\"878\" height=\"741\" class=\"wp-image-100693\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-graph-of-a-number-of-companies-description-auto-4.png\" alt=\"A graph of a number of companies\n\nDescription automatically generated with medium confidence\" \/><\/li>\n<li>Closing <strong>Power BI<\/strong> and saving changes<br \/>\nPower BI Desktop doesn\u2019t show any information related to source control yet. In Visual Studio Code, on the source control window, you will be able to see the changed files. They are identified as changed in the local folder, but a commit was not created ye<img loading=\"lazy\" decoding=\"async\" width=\"314\" height=\"163\" class=\"wp-image-100694\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-117.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/li>\n<li>On <strong>Visual Studio Code<\/strong>, on the <strong>Source Control<\/strong> window, click the <em>Commit<\/em> button<\/li>\n<li>On the new window, type a message to be used as your commit message<\/li>\n<li>Close the window<br \/>\nThe commit button changes its name to <em>Sync Changes<br \/>\n<\/em><img loading=\"lazy\" decoding=\"async\" width=\"306\" height=\"116\" class=\"wp-image-100695\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-118.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/li>\n<li>Click the <em>Sync Changes<\/em> button<br \/>\nThis is the same to make a Push from the local repository to the remote repository<br \/>\nOn Azure Devops, if you take a look on the branches, you will notice the Branch B is ahead Main<\/li>\n<\/ol>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"1330\" height=\"256\" class=\"wp-image-100696\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-white-rectangular-object-with-a-black-border-de-2.png\" alt=\"A white rectangular object with a black border\n\nDescription automatically generated\" \/><\/p>\n<h3>Testing the changes on the local repository<\/h3>\n<ol start=\"57\">\n<li>Click on Branch B, on <strong>Visual Studio Code<\/strong> Status Bar<br \/>\n<img loading=\"lazy\" decoding=\"async\" width=\"214\" height=\"23\" class=\"wp-image-100697\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/word-image-100615-34-1.png\" \/><\/li>\n<li>Select Main on the pallet, to checkout the Main branch<br \/>\n<img loading=\"lazy\" decoding=\"async\" width=\"288\" height=\"179\" class=\"wp-image-100698\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-119.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/li>\n<li>Open the PBIP with <strong>Power BI<br \/>\n<\/strong>You will notice the report doesn\u2019t contain the count visual now<br \/>\n<img loading=\"lazy\" decoding=\"async\" width=\"217\" height=\"106\" class=\"wp-image-100699\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-number-with-black-text-description-automaticall-5.png\" alt=\"A number with black text\n\nDescription automatically generated with medium confidence\" \/><\/li>\n<li>Close Power BI<\/li>\n<li>Click <em>Main<\/em> on <strong>Visual Studio Code<\/strong> Status Bar<\/li>\n<li>Select <em>Branch B<\/em> on the pallet, to checkout <em>Branch B<\/em><\/li>\n<li>Open PBIP with <strong>Power BI<br \/>\n<\/strong>The count visual is now present.<br \/>\n<img loading=\"lazy\" decoding=\"async\" width=\"878\" height=\"741\" class=\"wp-image-100700\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-graph-of-a-number-of-companies-description-auto-5.png\" alt=\"A graph of a number of companies\n\nDescription automatically generated with medium confidence\" \/><\/li>\n<\/ol>\n<p>In this way, you can keep and work in different versions of your Power BI report<\/p>\n<h2>TODO: The Power BI Portal and the multiple branches<\/h2>\n<p>At this moment, our workspace is linked to the <em>Branch B<\/em>, which we created. However, the server repository is more updated than <strong>Power BI<\/strong>. We need to follow some steps to fix this.<\/p>\n<h3>Pulling the repository to Power BI<\/h3>\n<ol start=\"64\">\n<li>On the <strong>Power BI<\/strong> portal, click <em>Source Control<\/em> button<br \/>\nPower BI will automatically compare the files it has with the files on the server, to check if they are updated, and show a status update on the column <em>GIT Status<br \/>\n<\/em><img loading=\"lazy\" decoding=\"async\" width=\"489\" height=\"324\" class=\"wp-image-100701\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-120.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><br \/>\nWe can notice the report was updated.<\/p>\n<\/li>\n<li>On the <em>Source Control<\/em> window, click the <em>Updates<\/em> tab. It will show the file updated.<br \/>\n<img loading=\"lazy\" decoding=\"async\" width=\"351\" height=\"714\" class=\"wp-image-100702\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-121.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/li>\n<li>Click the button <em>Update All<br \/>\n<\/em>This will be the same as making a <code>PULL<\/code> from the repository<\/li>\n<li>Open the report.<br \/>\nThe new visual is already available and with data<\/li>\n<\/ol>\n<p><strong><em>This is an important point: When we did the dataset refresh, we did on the branch Main, but the data is also available to Branch B. The Dataset Refreshes are independent of branches.<\/em><\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"1098\" height=\"895\" class=\"wp-image-100703\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-122.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/p>\n<p>We already know we can\u2019t change the workspace between existing branches using the <em>Source Control<\/em> button. We need to use <em>Workspace Settings<\/em>.<\/p>\n<ol start=\"68\">\n<li>On Power BI Portal, click Workspace Settings.<\/li>\n<li>On Workspace Settings window, click Git Integration<\/li>\n<li>On the branch dropdown, change the branch to main.<\/li>\n<li>Click the button Switch and Override<br \/>\nThis means the branches will switch and the current Power BI files will be replaced by the files from the new branch<\/p>\n<p><strong><em>Changing the branch on the Workspace Settings is not a User Level setting, it affects all the users of the workspace. This is something to plan very carefully.<\/p>\n<p><\/em><\/strong><img loading=\"lazy\" decoding=\"async\" width=\"405\" height=\"136\" class=\"wp-image-100704\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-123.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><br \/>\nYou will notice the <em>Syncing<\/em> status during the update process.<br \/>\n<img loading=\"lazy\" decoding=\"async\" width=\"588\" height=\"174\" class=\"wp-image-100705\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-white-rectangular-object-with-black-lines-descr-2.png\" alt=\"A white rectangular object with black lines\n\nDescription automatically generated\" \/><\/li>\n<\/ol>\n<h3>Changing the report on Power BI Portal<\/h3>\n<ol start=\"72\">\n<li>Open the report again.<br \/>\nYou will see only the card, the new visual doesn\u2019t exist in branch Main.<\/li>\n<li>Execute the steps 37-40 again, this time to return to Branch B<\/li>\n<li>Open the report<\/li>\n<li>On the top menu, Click the <em>Edit<\/em> button<br \/>\n<img loading=\"lazy\" decoding=\"async\" width=\"869\" height=\"47\" class=\"wp-image-100706\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/word-image-100615-43-1.png\" \/><\/li>\n<li>Select the <strong>Clustered Bar<\/strong> visual<\/li>\n<li>On the <strong>Visualizations<\/strong> window, click on Format Your Visual<\/li>\n<li>Click on the <strong>General<\/strong> tab<br \/>\n<img loading=\"lazy\" decoding=\"async\" width=\"183\" height=\"454\" class=\"wp-image-100707\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-124.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/li>\n<li>Open <strong>Title<\/strong> item<\/li>\n<li>On <strong>Text<\/strong>, change the title to <em>Cost by Product Model<\/em><\/li>\n<li>On the top of the window, click on the<strong> Save<\/strong> button<\/li>\n<\/ol>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"668\" height=\"46\" class=\"wp-image-100708\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/word-image-100615-45-1.png\" \/><\/p>\n<ol start=\"82\">\n<li>Return to the workspace<\/li>\n<li>We changed the report on the portal. The <em>GIT Status<\/em> column now shows <em>Uncommitted<\/em><\/li>\n<\/ol>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"437\" height=\"173\" class=\"wp-image-100709\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-125.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/p>\n<ol start=\"84\">\n<li>Click on the <strong>Source Control<\/strong> button<br \/>\nThis button is marked with \u201c1\u201d because there is one uncommitted file<br \/>\n<img loading=\"lazy\" decoding=\"async\" width=\"182\" height=\"41\" class=\"wp-image-100710\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/word-image-100615-47-1.png\" \/><\/li>\n<li>Select the changed files to be committed \u2013 only the report.\n<p>The <strong>Source Control<\/strong> window show all the changed files in the portal and allow us to choose which ones we would like to commit:<br \/>\n<img loading=\"lazy\" decoding=\"async\" width=\"348\" height=\"741\" class=\"wp-image-100711\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/11\/a-screenshot-of-a-computer-description-automatica-126.png\" alt=\"A screenshot of a computer\n\nDescription automatically generated\" \/><\/li>\n<\/ol>\n<ol start=\"86\">\n<li>Click the <strong>Commit<\/strong> Button<\/li>\n<\/ol>\n<h3>Checking the changes in the local repository<\/h3>\n<p>Let\u2019s check how the changes in the portal can be seen in the local repository<\/p>\n<ol start=\"87\">\n<li>Open Power BI Project<br \/>\nThe title of the visual is not updated, because the changes are on the server repository<\/li>\n<li>Close Power BI<\/li>\n<li>On <strong>Visual Studio Code<\/strong>, <strong>Source Control<\/strong> window, open the extension menu (\u201c&#8230;\u201d)<\/li>\n<li>Click on the Pull menu item<br \/>\nWe are getting the changes from the server to the local repository<\/li>\n<li>Open Power BI Project<\/li>\n<li>This time the title is updated<\/li>\n<\/ol>\n<h2>Process Planning: Additional Possibilities<\/h2>\n<p>After understanding the technology, let\u2019s talk about the additional possibilities we have about the architectures to use for the SDLC (Software Development Life Cycle).<\/p>\n<h3>Use source control without Deployment Pipelines<\/h3>\n<p>If we ignore the usage of the deployment pipelines, we can create 3 independent workspaces and link them with different branches of a repository.<\/p>\n<p>These 3 workspaces will become the Development environment, Test Environment and Production Environment.<\/p>\n<p>The movement from one environment to another and be controlled by the repository. A <strong>Pull Request<\/strong> can be made from one branch to another, and the repository can be configured to only proceed once approvers review the Pull Request. In this way, you can have control of the process to move between environments, with approvers involved in the process.<\/p>\n<p>There is one problem: Deployment pipelines automatically control the change of environment variables when moving the product between environments. Without them, you need to make this control manually.<\/p>\n<p>There are advantages in having the Test environment linked to a repository. It\u2019s possible to change the checkout branch and allow the user to test different version of what was produced and provide feedback over different versions, making the process easier.<\/p>\n<h3>Branch checkout and Multiple Developers<\/h3>\n<p>It\u2019s important to control carefully who will have permission to make a branch checkout in the workspace.<\/p>\n<p>There is no user level branch checkout, as it was highlighted before in this article. When a branch checkout happens in the workspace, it happens for all the developers, everyone is affected. If every developer can change the current branch at any moment, the result will be chaos.<\/p>\n<p>For example, imagine John and Mark working on the same workspace. The workspace is linked to Branch A. John makes a branch checkout of branch B without Mark knowing.<\/p>\n<p>Mark will get many types of the strange behaviors:<\/p>\n<ul>\n<li>He will make a push and not see the result in the workspace, without realizing he is using Branch A locally, but the workspace was changed to Branch B<\/li>\n<li>He may make a change on the portal thinking he is changing Branch A while in fact he is changing Branch B.<\/li>\n<li>He may make a change in the portal, pull the repository and not see the changes locally, because it\u2019s not the same branch and he is not aware about it.<\/li>\n<\/ul>\n<p>In this way, the permission to make a branch checkout in the workspace needs to be well controlled to avoid the kind of chaos above.<\/p>\n<p>However, we can use different processes on the development environment and on the test environment and get some benefits from it.<\/p>\n<ul>\n<li>In the Development environment, you need to choose one branch to be the development one and stick to it. In this way, you avoid the chaos exemplified<\/li>\n<li>In the Test environment, the change of branches gives you the possibility to demonstrate different visuals and approaches for the end user. You can create different versions of the reports and easily change the demonstration from one version to another.<\/li>\n<\/ul>\n<p><strong><em>But if the developers can\u2019t change the branch in the workspace, how will they make their individual development before publishing?<\/em><\/strong><\/p>\n<p>There are two possibilities:<\/p>\n<ul>\n<li>Use Power BI desktop and local workspaces for each individual development.<\/li>\n<li>Use a custom workspace in the portal dedicated to each developer. The developers can use this workspace to test what they are producing before merging their creations with the central development environment.<\/li>\n<\/ul>\n<h3>Use source control with a single developer<\/h3>\n<p>A single developer also needs the source control features to manage the environments correctly. However, because he is only one, some rules above don\u2019t apply to him.<\/p>\n<p>Specially the rule in relation to branch checkout. He can checkout different branches in Development and Test environment anytime he would like because there is no team to be affected. There is no need to limit himself to the local development or to have an additional workspace for this.<\/p>\n<h2>Summary<\/h2>\n<p>The feature is still in preview, we can expect to see a lot more coming out soon in Power BI Desktop to manage the source control.<\/p>\n<p>The feature makes our lives way easier, but we still have a lot to plan in relation to the development process we will use for <strong>Power BI<\/strong><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Source control is fundamental when dealing with projects and sharing code between multiple developers. Power BI present some challenges related to source control. But it\u2019s finally providing us with a solution to these challenges. Let\u2019s analyse this piece-by-piece. According to your previous knowledge, you may would like to skip some section of this article. This&#8230;&hellip;<\/p>\n","protected":false},"author":50808,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[143528,53],"tags":[159047],"coauthors":[6810],"class_list":["post-100615","post","type-post","status-publish","format-standard","hentry","category-bi-sql-server","category-featured","tag-fabric"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts\/100615","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/users\/50808"}],"replies":[{"embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/comments?post=100615"}],"version-history":[{"count":9,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts\/100615\/revisions"}],"predecessor-version":[{"id":100784,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts\/100615\/revisions\/100784"}],"wp:attachment":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/media?parent=100615"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/categories?post=100615"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/tags?post=100615"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/coauthors?post=100615"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}