Remove a git commit which has not been pushed

Learn remove a git commit which has not been pushed with practical examples, diagrams, and best practices. Covers git, git-commit development techniques with visual explanations.

How to Remove a Git Commit That Has Not Been Pushed

How to Remove a Git Commit That Has Not Been Pushed

Learn various methods to safely undo or remove a Git commit that exists only in your local repository and has not yet been pushed to a remote server. This guide covers git reset for different scenarios.

Accidentally committed something you didn't mean to, or perhaps made a mistake in your last commit message? If the commit hasn't left your local machine, Git provides powerful tools to rectify the situation without affecting your remote repository or collaborators. This article will guide you through the safest and most common ways to remove or modify unpushed commits.

Understanding Git Commit States

Before diving into removal techniques, it's crucial to understand the state of your commits. A commit exists in your local repository as long as it hasn't been pushed to a remote server (like GitHub, GitLab, or Bitbucket). Once pushed, removing it locally becomes more complex and can cause issues for others who have pulled your changes. This guide focuses exclusively on unpushed commits.

A Git workflow diagram showing local and remote repositories. The local repository has three commits (C1, C2, C3). An arrow points from C3 to 'Not Pushed' and another arrow points from C2 to 'Pushed'. This illustrates that C3 is local and unpushed, while C1 and C2 are pushed. The diagram uses blue boxes for commits and a green box for 'Remote Repository'.

Local vs. Pushed Commits in Git

Method 1: Using git reset --soft to Keep Changes

The git reset --soft command is ideal when you want to undo a commit but keep all the changes staged. This means the files modified in the undone commit will remain in your staging area, ready for a new commit. This is particularly useful if you want to combine multiple commits into one or simply fix a commit message without losing your work.

git reset --soft HEAD~1

This command moves HEAD back one commit, keeping changes staged.

After running this command, your previous commit will be gone from the history, but all the changes introduced by that commit will be in your staging area. You can then make any necessary modifications, amend the previous commit, or create a new commit with the corrected changes.

Method 2: Using git reset --mixed to Unstage Changes

The git reset --mixed (which is the default behavior if no option is specified) command undoes the commit and moves the changes from the staging area back to your working directory. This means the files will be modified, but not staged. You'll need to git add them again before making a new commit.

git reset HEAD~1
# or
git reset --mixed HEAD~1

This command moves HEAD back one commit and unstages changes.

This method is useful when you want to completely re-evaluate the changes from the undone commit. You can then selectively stage and commit parts of the changes, or discard some if they were truly accidental.

Method 3: Using git reset --hard to Discard All Changes

The git reset --hard command is the most destructive option. It undoes the commit, discards all changes in the staging area, and also removes all modifications from your working directory. Use this with extreme caution, as it will permanently delete any uncommitted changes and the changes introduced by the undone commit.

git reset --hard HEAD~1

This command moves HEAD back one commit and discards all changes.

Removing a Specific Commit by Hash

Instead of using HEAD~1 to refer to the last commit, you can also use the commit hash directly. This is useful if you want to undo a commit that is not necessarily the very last one, but still an unpushed commit. You'll need to find the hash of the commit before the one you want to remove.

1. Step 1

First, use git log to find the commit hash of the commit you want to revert to (i.e., the parent of the commit you want to remove). Copy the full hash.

2. Step 2

Then, use git reset --hard <commit-hash> (or --soft, --mixed) with the copied hash to move your HEAD to that specific commit. For example, git reset --hard a1b2c3d4.