# UI Bakery source control

{% hint style="info" %}
Contact our support team about the possibility of enabling Git on your plan.
{% endhint %}

**UI Bakery source control** is a *Git-based* version control system that allows you to manage your app's changes and collaborate with other developers. UI Bakery operates on the Git-API level, which means you can use any Git provider, such as GitHub, GitLab, BitBucket, etc.

**Main features:**

* Parallel development of a single application by multiple developers;
* Multi-instance support - multiple instances of UI Bakery connected to the same Git repository;
* Branch protection - you can protect branches from being changed directly in UI Bakery;
* Consistent development process - maintain the development process that is familiar to your team, including testing, code reviews, and deployment.

## Single instance process walkthrough

A newly created UI Bakery app or an app that is already developed can be connected to a Git repository.

{% stepper %}
{% step %}

### Connecting app to Git

1. Create a new app or open an existing one.
2. Navigate to your Git provider and create a **new** repository. \
   The repository MUST be empty.
3. In UI Bakery, click the **Connect Git** button in the top left corner.
4. Copy the *SSH repository URL* (for example, `git@github.com:user/fictional-octo-happiness.git`) and paste it to the **Git repository URL** field.
5. Next, copy the *SSH key* suggested by UI Bakery and create a new key in the **Deploy keys** settings of your Git provider. \
   For GitHub, follow the steps below:
   1. Open your repository settings and open the **Deploy keys** tab.
   2. Here, click **Add deploy key** and paste the SSH key you've copied before.
   3. Select the **Allow write** **access** checkbox and then click **Add key**.
6. In UI Bakery, click **Push to Git &** **Connect** and wait for the app to be pushed to the Git repository.

Once you connect an app to a Git repository, a new branch is created in the repository. This branch is called **main**. Main branch is protected from being changed directly in UI Bakery.
{% endstep %}

{% step %}

### Making changes to the app

1\. Go to the **main** branch and pull the latest changes.

2\. Create a **new** branch from the main branch.

3\. Make changes to the app.

4\. Commit and push the changes to the Git repository.

5\. Create a pull request to merge the changes to the **main** branch.

6\. Once the PR is approved and merged, pull the changes to the **main** UI Bakery instance.

Once the changes are pulled to the UI Bakery instance, you can review and deploy them using the standard UI Bakery workflow.
{% endstep %}

{% step %}

### Merging conflicts

UI Bakery app is split into multiple files and folders, which makes it easy to avoid merge conflicts. However, if you stumble upon a merge conflict while merging a PR, this means that the **main** branch was changed while you were working on your **feature** branch.

To resolve the conflict, you need to pull the latest changes from the main branch to your feature branch and resolve the conflicts manually using Git provider UI.

#### Merge conflicts involving UI Bakery updates

Sometimes you may encounter issues while working on different branches *before* and *after* updating your UI Bakery version. Below are some suggestions how you can possibly avoid such merge conflicts:

* Try planning your UI Bakery app updates for when you have only a few/no big features in development.
* Arranging actions into folders and utilizing pages for components can also help avoid any possible conflicts.
* After updating UI Bakery, **follow this flow** to make sure the branches created immediately after the update don't contain any unnecessary changes:
  * Update your UI Bakery app
  * Open the project you need and create a *new* branch
  * Do not make any changes in this branch
  * Next, commit, push, and merge this branch to the *main* branch
  * Once merged, pull the changes to the **main UI Bakery instance**
    {% endstep %}

{% step %}

### Restoring the previous version

When Git is connected to your app, it's no longer possible to restore versions from UI Bakery's [release history](https://docs.uibakery.io/workspace-management/app-environments/release-management#restoring-a-release-version).\
If you need to revert to the previous version, you need to synchronize your changes with the branch and pull it back to UI Bakery using the following steps:

1. **Git:**\
   — `git revert #{commit_hash}`\
   —  `git push`
2. **UI Bakery:**\
   — Pull branch changes from Git\
   — Release your app

{% hint style="success" %}
It should be noted that Git commits are *separate* from app releases. If, for example, you delete the branch from which the latest app version was released, your app will stay as it was.
{% endhint %}
{% endstep %}
{% endstepper %}

## Sources overview

A typical UI Bakery application is broken down into *files system structure* upon pushing to the Git repository.&#x20;

The following app sources **are stored** in the Git repository:

* App settings
* App pages and components
* App actions with folders structure

The following is **NOT stored** in Git (is a part of the UI Bakery instance):

* Instance data sources
* Deployment history
* Environment variables
* Audit logs
