Git Workflow Guide: From Chaos to Clarity
Git is powerful, but teams usually struggle because they do not agree on a few basics. A simple workflow keeps history readable, reviews focused, and releases less stressful. Most merge-conflict marathons and “who changed this?” debates begin with rules that were never made explicit.
This is a lightweight workflow a team can adopt in a day and refine as it grows.
A simple team workflow
- Branch from
mainfor every change. - Keep branches small and short-lived.
- Open a pull request early when feedback would help.
- Merge after review and automated checks pass.
- Delete the branch once the change is safely on
main.
The mechanics are easy. The value comes from following the same process even when the team is in a hurry.
Branch naming
Pick one convention and document it. I prefer type/short-description:
git switch -c feat/user-profile-settings git switch -c fix/login-redirect-loop git switch -c chore/upgrade-react git switch -c refactor/extract-auth-logic
Ticket prefixes such as APP-123-add-login work too. The exact format matters less than names that explain the branch without opening it.
Commit messages
A good commit message answers what changed. The diff explains how.
- Start with a clear verb: add, fix, remove, refactor, or document.
- Keep the first line short and specific.
- Split unrelated work into separate commits.
- Explain non-obvious reasoning in the body.
Good: fix: prevent checkout when the cart is empty.
Weak: fix stuff.
For a change that needs context:
fix: prevent repeated cart synchronization The effect received a new object on every render. Use a stable dependency so synchronization runs only when cart data changes.
Small commits make review and rollback easier, but “small” should still mean complete. A commit that cannot build or explain itself is usually too fragmented.
Rebase and merge
I rebase my own branch onto the latest main before review when a clean, linear history helps:
git fetch origin main git rebase origin/main
Do not casually rebase a shared branch. Rebasing rewrites commit history, so collaborators can end up resolving the same work twice. Merge is safer when several people are already building on the branch.
At the pull-request boundary, the team can choose merge commits, squash merges, or rebased commits. Each can work:
| Strategy | Useful when |
|---|---|
| Merge commit | The branch should remain visible as a unit of work |
| Squash merge | The branch contains noisy fix-up commits |
| Rebase merge | Individual commits are already clean and meaningful |
Consistency is more valuable than arguing that one strategy is universally correct.
A reviewable pull request
A pull request should make the reviewer’s job obvious:
- Explain what changed and why.
- Describe user impact or link the issue.
- Include screenshots for visual changes.
- Add tests, or explain why a test is not useful.
- Give exact verification steps.
## What Adds a theme switcher to account settings. ## Why Users need a persistent light and dark appearance preference. ## How to test 1. Open `/settings/appearance`. 2. Change the theme. 3. Reload and confirm the preference persists.
An early draft pull request is useful when the direction is uncertain. It creates a place for discussion before the implementation becomes expensive to change.
Resolving conflicts
When a branch conflicts with main:
- Fetch the latest
main. - Rebase or merge it into the branch.
- Read both sides of every conflict; do not automatically accept one side.
- Remove the conflict markers and run the relevant checks.
- Stage each resolved file and continue.
During a rebase:
git add path/to/resolved-file.ts git rebase --continue
If the rebase becomes confusing, git rebase --abort returns to the starting point. Pausing and choosing a clearer integration path is better than guessing through a conflict.
An end-to-end example
# Start from an up-to-date main branch git switch main git pull --ff-only origin main git switch -c feat/dark-mode-toggle # Make focused commits git add src/components/ThemeToggle.tsx git commit -m "feat: add theme toggle" git add src/hooks/useTheme.ts git commit -m "feat: persist theme preference" # Synchronize before review git fetch origin main git rebase origin/main # Publish the branch git push -u origin feat/dark-mode-toggle
After review, merge through the repository’s normal controls, verify the deployment, and remove the branch.
Protecting the default branch
Workflow conventions are stronger when the repository enforces them. Require pull requests, passing checks, and at least one review for important repositories. Prevent force pushes to main, and define who can bypass protections during an incident.
These controls should support the team, not create ceremony for its own sake. A small personal project may need fewer gates than a production service with several contributors.
Wrap-up
The goal is not perfect Git. It is fewer surprises and faster collaboration. Start with short-lived branches, useful commits, and review instructions that another person can actually follow. Write the decisions down once, automate the important ones, and revise the workflow when the team—not fashion—outgrows it.
