close icon
daily.dev platform

Discover more from daily.dev

Personalized news feed, dev communities and search, much better than whatโ€™s out there. Maybe ;)

Start reading - Free forever
Start reading - Free forever
Continue reading >

Git Best Practices: Effective Source Control Management

Git Best Practices: Effective Source Control Management
Author
Nimrod Kramer
Related tags on daily.dev
toc
Table of contents
arrow-down

๐ŸŽฏ

Learn about Git best practices, effective source control management, branching strategies, team collaboration, advanced Git skills, security practices, and more in this comprehensive guide.

Here's a quick guide to using Git effectively:

  • Set up Git: Configure your name and email, create a .gitignore file
  • Make good commits: Write clear messages, keep commits small and focused
  • Use branches: Create feature branches for new work
  • Collaborate: Use pull requests and code reviews
  • Resolve conflicts: Learn to fix merge conflicts
  • Advanced skills: Understand rebasing, cherry-picking, and hooks
  • Stay secure: Protect sensitive data, set access controls, sign commits
  • Manage large projects: Use Git LFS, work with monorepos

Quick Comparison of Branching Strategies:

Strategy Best For Pros Cons
Feature Branching Small-medium projects Separates work, easy to manage Can lead to integration issues
GitFlow Large, complex projects Structured releases, good for maintenance Complex, can slow development
Trunk-Based Fast-moving teams Simple, promotes continuous integration Requires disciplined team, can be risky

Remember: Commit often, write clear messages, and keep learning as Git evolves.

Git Basics

Git

Core Git Concepts

Git has four main parts:

  1. Repository: A folder with all your project files and history.
  2. Commits: Snapshots of your code at specific times.
  3. Branches: Separate lines of work in your project.
  4. Staging Area: A place to prepare changes before saving them.

Common Git Workflow

Here's how to use Git:

  1. Change your files
  2. Use git add to stage changes
  3. Use git commit to save changes
  4. Use git push to send changes to a shared repository

Important Git Terms

Term Meaning
Bare Repository A repository without working files
Clone A copy of a repository
Fetch Get changes from a shared repository
Merge Combine changes from different branches
Pull Get and merge changes from a shared repository
Push Send changes to a shared repository
Remote A repository on another computer
Tag A label for a specific commit

Setting Up Git

Git Configuration Steps

To start using Git, set it up on your computer:

1. Open a terminal or command prompt

2. Set your name and email:

git config --global user.name "Your Name"
git config --global user.email "youremail@example.com"

3. Check your settings:

git config --list

This shows all your Git settings, including your name and email.

Creating a .gitignore File

A .gitignore file tells Git which files to ignore in your project. To make one:

  1. Go to your project's main folder
  2. Create a file named .gitignore
  3. Add file or folder names to ignore, one per line

Examples:

build.log
*.tmp

This ignores build.log and all files ending in .tmp.

Selecting a Branching Strategy

Branching helps organize your work in Git. Choose a strategy based on your needs:

Strategy Description Best for
Feature branching Make a new branch for each feature Small to medium projects
Release branching Make a new branch for each release Projects with set release dates
GitFlow Use separate branches for features, releases, and fixes Large, complex projects

When picking a strategy, think about:

  • How big is your project?
  • How many people are working on it?
  • How often do you release new versions?

Choose a strategy that fits your team and project size.

Good Commit Practices

Clear Commit Messages

Good commit messages help keep your project's history clear. Here's how to write them:

  • Use simple, direct language
  • Keep the first line short (50 characters or less)
  • Add more details in the body if needed
  • Use present tense (e.g., "Add feature" not "Added feature")

Example of a good commit message:

Add multi-language support

- Update database schema
- Create new API endpoints
- Change UI to show language options

Small, Focused Commits

Making small commits helps manage your project better. It lets you:

  • Find and fix problems easily
  • Work with others more smoothly
  • Review and test code more quickly

Tips for small commits:

  • Make one change at a time
  • Commit often
  • Don't mix unrelated changes

Example of a small commit:

Fix login bug

- Update login API
- Fix user model

How Often to Commit

How often you commit depends on your project and how you work. Here are some tips:

When to Commit Why
Every 30-60 minutes For big, complex tasks
Every 1-2 hours For smaller tasks or bug fixes
After finishing a feature To keep your work organized

Remember:

  • Save your work often
  • Don't commit broken code
  • Use code reviews before merging into the main branch

Branching Methods

Feature Branches

Feature branches are a way to work on different parts of a project at the same time. Here's how they work:

  1. Make a new branch from the main branch (e.g., feature/new-login-system)
  2. Change the code in the new branch
  3. Save changes often
  4. When done, add the new branch to the main branch

Feature branches are good for:

  • Working on many things at once
  • Keeping changes separate
  • Testing before adding to the main code

But they can cause:

  • Problems when joining branches
  • Too many branches to manage

GitFlow Overview

GitFlow

GitFlow uses two main branches: master and develop. The master branch is for finished code, and the develop branch is for work in progress.

How GitFlow works:

  1. Make a new branch from develop (e.g., feature/new-feature)
  2. Change the code in the new branch
  3. Save changes often
  4. When done, add the new branch to develop
  5. Make a release branch from develop (e.g., release/v1.0)
  6. Test the release branch
  7. Add the release branch to master

GitFlow is good for:

  • Managing different versions of your code
  • Keeping changes separate
  • Testing before adding to the main code

But it can be hard to use and may need extra tools.

Trunk-Based Development

Trunk-Based Development uses one main branch for all work. It's simpler than other methods.

How it works:

  1. Change code in the main branch
  2. Save changes often
  3. Use pull requests to check changes before adding them

Trunk-Based Development is good for:

  • Small teams or simple projects
  • Making changes quickly

But it can cause:

  • Problems when many people work on the same code
  • Hard to manage changes and testing

Branching Methods Comparison

Method How it Works Good Things Bad Things
Feature Branches Make a new branch for each task Keeps changes separate, lets people work at the same time Can cause problems when joining branches, hard to manage many branches
GitFlow Uses master and develop branches Manages different versions well, keeps changes separate Can be hard to use, needs extra tools
Trunk-Based Development Uses one main branch for all work Simple to use, makes changes quickly Can cause problems when many people work on the same code, hard to manage changes

Pick the method that works best for your team and project. Think about what you need and what problems you might face.

Team Collaboration

Pull Requests and Code Reviews

Pull requests and code reviews help teams work together in Git. They let people suggest changes and check them before adding them to the main code.

How to make a pull request:

  1. Change your code in a new branch
  2. Save your changes
  3. Send your changes to the shared repository
  4. Go to the repository online
  5. Click "New pull request"
  6. Pick the branch you want to add to
  7. Write a clear title and description
  8. Click "Create pull request"

How to review a pull request:

  1. Go to the repository online
  2. Click on the pull request
  3. Read the description and comments
  4. Look at the code changes
  5. Leave comments or ideas
  6. Say yes or no to the changes

Pull requests and code reviews help make sure changes are good before they're added to the main code. This helps stop bugs and makes the code easier to work with.

Fixing Merge Conflicts

Merge conflicts happen when two or more people change the same code. Here's how to fix them:

  1. Find the conflict
  2. Open the file with the conflict
  3. Fix the conflict by changing the file
  4. Add the fixed file to Git
  5. Save the fixed file
  6. Send the fixed file to the shared repository

Fixing merge conflicts can be hard, but you'll get better with practice.

Contributing to Open-Source Projects

Working on open-source projects helps you learn from other coders. Here's how to do it:

  1. Find a project you like
  2. Read how to help
  3. Make a copy of the project
  4. Change the code in your copy
  5. Ask to add your changes
  6. Wait for the project owners to look at your changes
  7. Fix any problems they find
  8. Get your changes added to the project

Working on open-source projects helps you learn new things and show what you can do.

Method What It Does Good Things Bad Things
Pull Requests Ask to add changes Changes are checked Can be slow
Code Reviews Look at changes before adding them Makes code better Takes time
Open-Source Work Help with free projects Learn new things, show skills Can be hard
sbb-itb-bfaad5b

Advanced Git Skills

Rebasing vs. Merging

Rebasing and merging are two ways to add changes from one branch to another in Git. They work differently:

Git Merge:

  • Keeps all commit history
  • Makes a non-linear project history
  • Easy to use

To merge:

git merge <branch-name>

Git Rebase:

  • Rewrites commit history
  • Makes a linear project history
  • Can be harder to use

To rebase:

git rebase <branch-name>
Method Pros Cons
Merge Keeps original context, Simple to use Can make messy history
Rebase Makes clean history, Easier to read Can cause problems if not used carefully

Cherry-Picking Commits

Cherry-picking lets you add specific commits from one branch to another without merging everything. It's useful for quick fixes or adding certain features.

To cherry-pick:

git cherry-pick <commit-hash>

When to use cherry-picking:

  • Fix bugs quickly
  • Add specific features to older versions
  • Change the order of commits

Be careful when cherry-picking, as it can create duplicate commits.

Using Git Hooks

Git hooks are scripts that run at certain times in Git. They help automate tasks and keep code consistent.

Common hooks:

  • Pre-commit: Runs before a commit
  • Post-commit: Runs after a commit
  • Pre-push: Runs before pushing changes

To set up a hook:

  1. Go to the .git/hooks folder in your project
  2. Make a script with what you want to do
  3. Make sure the script can run

Example of a pre-commit hook:

#!/bin/sh
# Check for issues before committing
npm run lint

To make the script work:

chmod +x .git/hooks/pre-commit
Hook Type When It Runs What It Can Do
Pre-commit Before committing Check code quality
Post-commit After committing Send notifications
Pre-push Before pushing Stop bad code from being shared

Improving Git Workflow

Using Git Aliases

Git aliases help you work faster by making short versions of long commands. Here's how to set up some useful aliases:

git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status

With these aliases, you can:

  • Use git co instead of git checkout
  • Use git br instead of git branch
  • Use git ci instead of git commit
  • Use git st instead of git status

These shortcuts save time and make working with Git easier, especially for big projects.

Git GUI Tools

While command-line Git is powerful, GUI tools can make some tasks easier. They show your project visually, which can help you understand what's happening.

Tool What it does
Sourcetree Free, easy to use, works with Git Flow
GitKraken Looks nice, works with many services
GitHub Desktop Makes GitHub easier, simple to use

GUI tools can help new developers learn Git and make complex tasks simpler for everyone.

Git in CI/CD Pipelines

Using Git with CI/CD (Continuous Integration/Continuous Deployment) helps make sure your code works well and gets to users quickly. Here's what it does:

  • Tests code automatically: Checks if new code breaks anything
  • Gives quick feedback: Tells developers if there are problems right away
  • Makes releases the same every time: Puts out new versions the same way each time

To use Git with CI/CD:

  1. Pick a CI/CD tool (like Jenkins or GitHub Actions)
  2. Set it up to watch your Git repository
  3. Make it run tests and put out new versions when you change your code

This helps catch problems early and makes putting out new versions of your software easier and safer.

Git Security Practices

Protecting Sensitive Data

Keeping sensitive data safe in Git is key. Here's how to do it:

1. Use a .gitignore file:

  • List files and folders you don't want Git to track
  • Keep private keys and config files out of Git

2. Use tools like git-secrets:

  • Check commits for sensitive info before pushing
  • Stop accidental leaks of important data

Setting Access Controls

Control who can access your Git repos to keep them safe:

1. Set up access roles for each repo 2. Give permissions based on team roles 3. Check access settings often

This helps stop people from seeing or changing things they shouldn't.

Signing Commits and Tags

Signing commits and tags makes your code more secure:

1. Use GPG (GNU Privacy Guard) to sign commits 2. Make a GPG key pair:

  • Private key: Sign your commits
  • Public key: Store in the repo
Benefits of Signed Commits
Shows who made the changes
Proves the code wasn't changed
Builds trust in the team

Signing commits helps keep your Git workflow safe and trustworthy.

Fixing Common Git Problems

Solving Merge Conflicts

Merge conflicts happen when two branches change the same part of a file. Here's how to fix them:

  1. Find the conflict: Git will tell you which files have problems.
  2. Open the file: Look for lines with <<<<<<< HEAD, =======, and >>>>>>> other-branch-name.
  3. Fix the conflict: Choose which changes to keep.
  4. Remove the conflict markers.
  5. Save the changes:
git add fixed-file.js
git commit -m "Fix merge conflict in fixed-file.js"
  1. If needed, finish the merge:
git merge --continue

Finding Lost Commits

If you lose a commit, you can get it back using git reflog. This shows all changes in your repository.

To find a lost commit:

  1. Run git reflog to see all actions.
  2. Find the commit you want.
  3. To go back to that commit:
git checkout HEAD@{n}

Or to move your branch to that commit:

git reset --hard HEAD@{n}

Managing Large Repositories

Big repositories can be slow and hard to work with. Here's how to make them easier to manage:

Method What it does How to use it
Git LFS Stores big files outside the main repository Install Git LFS and set up tracking for large files
Clean up history Combines multiple commits into one Use git rebase or git squash
Shallow clone Gets only the latest version of the code Use git clone --depth 1 <repository-url>

These methods can help make large repositories faster and easier to work with.

Git for Big Projects

Working with Monorepos

Monorepos are single repositories that hold many projects. They can make working together easier but can also cause problems like bigger repos and more complex setups. To use monorepos well:

  • Keep a clean history by using rebasing
  • Make small, focused commits
  • Organize folders clearly
  • Clean up branches often
  • Think about using trunk-based development

Using Git LFS for Large Files

Git LFS

Big projects often have large files that can slow down Git. Git Large File Storage (LFS) helps by:

  • Storing big files outside the main repo
  • Using small pointer files instead
  • Making cloning and fetching faster

To use Git LFS:

  1. Install the Git LFS extension
  2. Set it up to track big files (like images or videos)

This keeps your repo small and fast while still handling large files.

Git in Enterprise Settings

Big companies often have large, complex projects. To use Git well in these settings:

Best Practice Why It Helps
Use Git LFS Manages big files better
Have a clear branching plan Helps teams work at the same time
Set rules for commit messages Makes the history easier to read
Name branches consistently Helps everyone understand the work
Use Git hooks Checks code automatically
Train team members Helps everyone use Git better

These practices help big teams work together more smoothly and manage projects better.

Conclusion

Key Git Best Practices

Here are some main ways to use Git well:

Practice Why It Helps
Set up a clear Git workflow Helps teams work together better
Use branches and pull requests Makes it safe to try new things
Set up Git hooks Checks code before saving
Make small, clear commits Makes it easy to track changes
Write good commit messages Helps others understand what changed

Keep Learning Git

Git keeps changing, so keep learning about it. Here's how:

  • Ask your team for tips
  • Read about new Git tricks
  • Join online Git groups

Learn about harder Git tasks like rebasing and cherry-picking. These can help you fix problems and work faster.

FAQs

What Git workflow is used by teams that collaborate on a single branch?

Teams that work together on one branch often use a centralized Git workflow. Here's how it works:

Feature Description
Branch Everyone uses the main branch
Commits Team members add changes directly to the main branch
Best for Small teams
Key need Good team communication

This way of working helps small teams:

  • Keep things simple
  • Work quickly
  • Avoid extra branches

But it can cause problems if:

  • Many people change the same code
  • The team doesn't talk often

To use this workflow well:

  • Talk to your team often
  • Check what others are working on
  • Be careful not to overwrite others' work

Related posts

Why not level up your reading with

Stay up-to-date with the latest developer news every time you open a new tab.

Read more