For learning how to use git:
A Git workflow encourages effective collaboration, makes software development process more efficient, and facilitates continuous delivery. By choosing a singular Git workflow, teams can pave the way for smoother conflict resolution and a more coherent code base.
A centralized Git workflow enables all team members to make changes directly to the main branch, with every change logged in a running history. This works well for small teams (or beginners), because team members can communicate easily in order to avoid contributing to the same piece of code simultaneously.
Limitations: If multiple developers commit to the same branch, it’s challenging to find a stable moment to release changes. Consequently, developers must keep unstable changes local until they’re ready for release.
Rather than commit directly to the main branch, developers create a branch for each feature, make changes, submit a merge request (or pull request), and then merge it into main. This has the benefit of keeping a clean main branch without unfinished features.
Teams of any size can use this feature branching, because it permits multiple developers to work on the same feature simultaneously.
This workflow doesn’t add any new concepts beyond the Feature Branch Workflow, while it assigns specific roles to different branches and defines how and when they should interact. Here you would use a develop branch with feature branches.

The main branch should always be releasable to production, and there should never be untested / incomplete code on it. When the develop branch is ready to go to production, a contributor creates a release branch where testing and bug fixing occur before being merged back to the develop branch.
The release branch makes the code review process easier, because there’s a dedicated place to resolve conflicts when merging into the main branch. With this strategy, the main branch always reflects production.
Trunk-based development facilitates concurrent development on a single branch called trunk. Developers work directly on trunk or on short-lived branches, and when they are ready to release, they use release branches.

Trunk-based development decreases the likelihood of merge conflicts and keeps code clean, because there are many frequent, small merges made each day.
Personal branching is similar to feature branching, but rather than have a single branch per feature, it’s per developer. This approach works well if team members work on different features and bugs.
Every user can merge back to the main branch whenever their work is done.
Advantages:
This strategy can work well for small teams in which every team member develops their own part of the application.
A forking approach to version control starts with a complete copy of the repository. Forking effectively creates a local copy of a Git repository and provides the ability to create a new collaboration structure.
This workflow is popular for projects that have multiple developers contributing to it, particularly open source projects. After all, keeping track and providing privileges to collaborate to a repository with thousands of contributors is difficult to maintain.
If a maintainer enables contributors to try their changes on their forked copy, managing change proposals is easier and safer.
Benefits:
Images sources: Toptal – Trunk Based Development vs Git Flow
Source: https://conventional-branch.github.io/
Conventional Branch refers to a structured and standardized naming convention for Git branches which aims to make branch more readable and actionable
Key Points
The branch specification supports the following prefixes and should be structured as:
<type>/<description>main: The main development branch (e.g., main, master, or develop)feature/ (or feat/): For new features (e.g., eature/add-login-page, feat/add-login-page)bugfix/ (or fix/): For bug fixes (e.g., bugfix/fix-header-bug, fix/header-bug)hotfix/: For urgent fixes (e.g., hotfix/security-patch)release/: For branches preparing a release (e.g., release/v1.2.0)chore/: For non-code tasks like dependency, docs updates (e.g., chore/update-dependencies)| Branch Name | Valid | Notes |
|---|---|---|
| main | β | Trunk branch |
| master | β | Trunk branch |
| develop | β | Trunk branch |
| feature/add-login-page | β | New feature |
| feat/add-login-page | β | Short alias for feature |
| bugfix/fix-header-bug | β | Bug fix |
| fix/header-bug | β | Short alias for bugfix |
| hotfix/security-patch | β | Urgent fix |
| release/v1.2.0 | β | Release with version |
| chore/update-dependencies | β | Non-code task |
| feature/issue-123-new-login | β | Feature with ticket number |
| Feature/Add-Login | β | Uppercase letters not allowed |
| feature/new—login | β | Consecutive hyphens not allowed |
| feature/-new-login | β | Leading hyphen in description |
| feature/new-login- | β | Trailing hyphen in description |
| release/v1.-2.0 | β | Hyphen adjacent to dot |
| fix/header bug | β | Spaces not allowed |
| fix/header_bug | β | Underscores not allowed |
| unknown/some-task | β | Unknown prefix type |
Source: https://www.conventionalcommits.org/en/v1.0.0/
The Conventional Commits specification is a lightweight convention that provides an easy set of rules for creating an explicit commit history,
which makes it easier to write automated tools on top of.
The commit message should be structured as follows:
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]The commit contains the following structural elements, to communicate intent to the consumers of your library:
fix patches a bug in your codebase (this correlates with PATCH in Semantic Versioning).feat introduces a new feature to the codebase (this correlates with MINOR in Semantic Versioning).BREAKING CHANGE:, or appends a ! after the type/scope, introduces a breaking API change
(correlating with MAJOR in Semantic Versioning). A BREAKING CHANGE can be part of commits of any type.fix: and feat: are allowed, for example build:, chore:, ci:, docs:, style:, refactor:, perf:, test:, and others.BREAKING CHANGE: <description> may be provided and follow a convention similar to git trailer format.Additional types are not mandated by the Conventional Commits specification, and have no implicit effect in Semantic Versioning (unless they include a BREAKING CHANGE). A scope may be provided to a commitβs type, to provide additional contextual information and is contained within parenthesis, e.g., feat(parser): add ability to parse arrays.
Commit message with description and breaking change footer
feat: allow provided config object to extend other configs
BREAKING CHANGE: `extends` key in config file is now used for extending other config filesCommit message with ! to draw attention to breaking change
feat!: send an email to the customer when a product is shippedCommit message with scope and ! to draw attention to breaking change
feat(api)!: send an email to the customer when a product is shippedCommit message with both ! and BREAKING CHANGE footer
feat!: drop support for Node 6
BREAKING CHANGE: use JavaScript features not available in Node 6.Commit message with no body
docs: correct spelling of CHANGELOGCommit message with scope
feat(lang): add Polish languageCommit message with multi-paragraph body and multiple footers
fix: prevent racing of requests
Introduce a request id and a reference to latest request. Dismiss
incoming responses other than from latest request.
Remove timeouts which were used to mitigate the racing issue but are
obsolete now.
Reviewed-by: Z
Refs: #123