๐Ÿค–Save up to $132K/month in CI costs!Try Freeโ†’
Skip to main content

Complete Guide to Git Reset Branches

6 min read
DevOps Engineer, Former Frontend Engineer ๐Ÿ”ง
My focus is on automating workflows and making sure CI/CD pipelines run like a well-oiled machine.

This article was last updated on February 03, 2025, to provide a comprehensive guide on Git reset commands, including practical use cases for --soft, --mixed, and --hard resets, recovery strategies for lost commits, and troubleshooting tips, all explained with simplified examples to enhance understanding.

What is Git Reset Branch Command? A Complete Guideโ€‹

TL;DR

What is Git Branch Reset?
Conceptualize Git branch reset as a sort of time machine for your source, a mechanism through which your work locally can be synced with GitHub, with a feature to discard your work or save it.

What is resetting a Git branch?

  • when your inhouse branch is not in harmony with offsite
  • To discard experimental changes
  • To start anew in a state of innocence
  • To fix merge conflicts

Warning: Back up your modifications first, then reset. It's similar to taking a picture when moving your furniture.

I remember my first catastrophic Git reset, having blown a whole lot of work through not having a clue about getting into it.

That's why I'm producing this guide: to allow you to learn from my mistakes and use Git reset both effectively and safely.

Steps we'll cover:

Git Branch States: Understanding Local vs Remoteโ€‹

I can use an analogy everyone can understand: a book with a bookmark. Your working directory is your personal bookmark, and your shared bookmark is everyone else in your book group's shared bookmark.

Click to zoom

Sometimes, these bookmarks will become out of whack, having moved a page when a fellow student moved the actual marker. That is when you will have to realign your marker with everyone else's.

Interactive Git Reset Tutorial: Try Our Simulatorโ€‹

Care to practice Git reset in real life? Give our simulator a try below and practice resets of all types with no risk of ruining your actual code:

Local Branch

A

Remote Branch

A

Cannot fast-forward - branches have diverged โŒ

The simulator in question allows:

  • Make a commit in your local branch
  • Check the state of the remote branch
  • Try out several types of resetting operations
  • Fantasize about what your commits will become

Practice with it beforehand will make it easier for you to understand its working when working with your real-life repositories.

Git Reset Types: Soft, Mixed, and Hard Reset Explainedโ€‹

Conceptualize Git reset in terms of having a variety of "levels" of "undo" in a text file, and I will use three of my most frequently used types:

Soft Restart (Keep Changes but Move Pointer)

git reset --soft origin/main

Mixed Reset (Default - Don't Remove Files but Unstage)

git reset origin/main

Complete Reboot (Complete Reset)

git reset --hard origin/main

Git Reset Tutorial: How to Safely Reset Your Branchโ€‹

Here is my guaranteed technique for resetting branches (the painful way I have discovered!).

1. First, confirm what you're about to edit:

2. Branch out for a backup (always!). Create a backup of your current state

git branch backup-before-reset

3. Obtain most updated information:

Get the latest state from remote

git fetch origin

4. Do a re-setting: Reset to match remote

git reset --hard origin/main

Git Reset Recovery: How to Recover Lost Commitsโ€‹

Don't fret! Even when I have a forced reload, your work isn't necessarily lost. What I do when I have a reload:

Check the reflog (your Git time machine)

git reflog

# Reset back to where you were
git reset --hard HEAD@{1}

Git Reset Best Practices: Tips from a Senior Developerโ€‹

After years of using (and abusing) Git reset, these are my gold rules:

1. Always Create a Backup Branch

Before any reset operation

git branch backup-$(date +%Y%m%d)

2. Retrieval Before Re 10

3. Check Status First

Git Reset Troubleshooting: Common Problems and Solutionsโ€‹

How to Resolve Git Error: "Cannot reset: Local changes would be overwritten"

This happens when having uncommitted changes. I work with it in the following way:

# First, stash your changes
git stash

# Then reset
git reset --hard origin/main

# Later, get your changes back
git stash pop

How to Resolve Git Error: "Updates Were Rejected - Branch is Behind"

This most commonly happens when someone else forced changes when you have been working

# Get the latest changes
git fetch origin

# Reset to match remote
git reset --hard origin/main

Comparison Table: Git Reset Command Typesโ€‹

--softโ€‹

  • Staging Area: Keeps staged changes intact.
  • Working Directory: No changes; edits remain.
  • Commit History: Moves the branch pointer to the target commit.
  • Purpose: Adjust commit history without altering staged or working directory changes.
  • When to Use: Undo the latest commit but keep changes staged for re-committing.
  • Example Command: git reset --soft <commit-hash>

--mixedโ€‹

  • Staging Area: Clears changes from the staging area.
  • Working Directory: Keeps all edits unchanged.
  • Commit History: Moves the branch pointer to the target commit.
  • Purpose: Unstage changes while keeping working directory intact.
  • When to Use: Rework or fix changes accidentally staged.
  • Example Command: git reset --mixed <commit-hash>

--hardโ€‹

  • Staging Area: Clears everything.
  • Working Directory: Removes all edits.
  • Commit History: Moves the branch pointer to the target commit.
  • Purpose: Completely discard changes in the working directory and staging area.
  • When to Use: Abandon all changes and reset the branch to match a specific commit.
  • Example Command: git reset --hard <commit-hash>

Conclusionโ€‹

git reset is a sort of a source-code time machine - powerful but with a sensitive touch. Start with soft resets whenever possible, backup whenever, and don't forget: when in doubt, git reflog is your best friend.

Remember: It's better to spend an extra minute creating a backup branch than spending hours trying to recover lost work. Trust me, I learned this the hard way!