|  | --- | 
|  | title: "Development Workflow" | 
|  | sidebar_position: 03 | 
|  | --- | 
|  |  | 
|  | # Development Workflow | 
|  |  | 
|  | This document shows the workflow of how to develop DevLake. | 
|  |  | 
|  | ## Step 1 - Fork the repo | 
|  |  | 
|  | 1. Visit the DevLake repo: https://github.com/apache/incubator-devlake; | 
|  | 2. Click the Fork button to create a fork of the DevLake; | 
|  | 3. We assume your fork is called `https://github.com/{user}/{repo}`. | 
|  |  | 
|  |  | 
|  | ## Step 2 - Clone the repo | 
|  |  | 
|  | 1. Create your clone locally | 
|  |  | 
|  | ```sh | 
|  | mkdir -p ${WORKING_PATH} | 
|  | cd ${WORKING_PATH} | 
|  | # You can also use the url: github.com/apache/incubator-devlake | 
|  | # if your ssh configuration is proper | 
|  | git clone https://github.com/{user}/{repo}.git | 
|  |  | 
|  | cd ${PROJECT} | 
|  |  | 
|  | git remote add upstream https://github.com/apache/incubator-devlake.git | 
|  | # Never push to upstream locally | 
|  | git remote set-url --push upstream no_push | 
|  | ``` | 
|  |  | 
|  | 2. Confirm the remotes you've set is make sense | 
|  |  | 
|  | Execute `git remote -v` and you'll see output like below: | 
|  |  | 
|  | ```sh | 
|  | origin  github.com/apache/incubator-devlake.git (fetch) | 
|  | origin  github.com/apache/incubator-devlake.git (push) | 
|  | upstream        https://github.com/apache/incubator-devlake.git (fetch) | 
|  | upstream        no_push (push) | 
|  | ``` | 
|  |  | 
|  | ## Step 3 - Keep your branch in sync | 
|  |  | 
|  | You will often need to update your local code to keep in sync with upstream | 
|  |  | 
|  | ```sh | 
|  | git fetch upstream | 
|  | git checkout main | 
|  | git rebase upstream/main | 
|  | ``` | 
|  |  | 
|  | ## Step 4 - Coding | 
|  |  | 
|  | First, you need to pull a new branch, the name is according to your own taste. | 
|  |  | 
|  | ```sh | 
|  | git checkout -b feat-xxx | 
|  | ``` | 
|  |  | 
|  | Then start coding. | 
|  |  | 
|  | ## Step 5 - Commit & Push | 
|  |  | 
|  | ```sh | 
|  | git add <file> | 
|  | git commit -s -m "some description here" | 
|  | git push -f origin feat-xxx | 
|  | ``` | 
|  |  | 
|  | ### Style guides | 
|  |  | 
|  | ##### Git Commit message | 
|  |  | 
|  | We follow the [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) guidelines. | 
|  |  | 
|  | ##### Commit tool | 
|  |  | 
|  | We use https://github.com/lintingzhen/commitizen-go to author our commits. | 
|  |  | 
|  | ``` | 
|  | > git cz | 
|  |  | 
|  | cz-cli@4.2.4, cz-conventional-changelog@3.3.0 | 
|  |  | 
|  | ? Select the type of change that you're committing: (Use arrow keys) | 
|  | > feat:     A new feature | 
|  | fix:      A bug fix | 
|  | docs:     Documentation only changes | 
|  | style:    Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc) | 
|  | refactor: A code change that neither fixes a bug nor adds a feature | 
|  | perf:     A code change that improves performance | 
|  | test:     Adding missing tests or correcting existing tests | 
|  | (Move up and down to reveal more choices) | 
|  | ? What is the scope of this change (e.g. component or file name): (press enter to skip) | 
|  | ? Write a short, imperative tense description of the change (max 93 chars): | 
|  | (23) add commit message tool | 
|  | ? Provide a longer description of the change: (press enter to skip) | 
|  |  | 
|  | ? Are there any breaking changes? No | 
|  | ? Does this change affect any open issues? No | 
|  | [chore/commit_message dc34f57] chore: add commit message tool | 
|  | 5 files changed, 585 insertions(+), 4 deletions(-) | 
|  | ``` | 
|  |  | 
|  |  | 
|  | Then you can create a `pr` on GitHub. |