Git: How to undo a ‘git add’ command (unstage files)

Updated: January 27, 2024 By: Guest Contributor Post a comment

Introduction

Git is an essential tool for version control, allowing multiple developers to work on a project simultaneously without hindering each other’s progress. One common situation developers find themselves in is after staging files for a commit using the git add command, they may wish or need to unstage some of the files. Whether it’s because the files contain errors or have been inadvertently staged, knowing how to undo this command is crucial in a developer’s workflow. This tutorial will walk you through various methods to unstage files in Git, from basic techniques to more advanced use cases, always understanding the implications and gaining full control over the staging area.

Basic Unstaging: One File Unstage

To unstage a file that has been accidentally added to the staging area, you can use the git reset HEAD command. This tells git to move the HEAD, which is a pointer to the last commit on the current branch, back one step, effectively un-staging the file.

git reset HEAD <file>

This command will undo the add to the staging area without changing the file in the working directory. Here’s an example:

$ git add accidentally_staged_file.txt
$ git status
On branch main
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	new file:   accidentally_staged_file.txt

$ git reset HEAD accidentally_staged_file.txt
Unstaged changes after reset:
M	accidentally_staged_file.txt

After running the reset command, if you run git status, you’ll see that the file has been removed from the staging area and is back in the list of changes not staged for commit.

Unstaging Multiple Files

If you need to unstage multiple files, you can use the git reset HEAD command with each file name. You can also use patterns with the command:

git reset HEAD file1.txt file2.js file3.py

This will unstage the specified files while leaving other staged changes intact. Alternatively, you can unstage all the files at once:

git reset HEAD .

By using a period (.), you are referring to the current directory, which implies unstaging all staged files. After this, use git status to confirm that the files are unstaged.

Using git restore for Unstaging

From Git version 2.23 onwards, a new command git restore is introduced which can be also used for unstaging files:

git restore --staged <file>

This command is more intuitive compared to git reset and specifically designed for the purpose of restoring file states. Similar to the previous examples, if you wish to unstage all files, you can do so by:

git restore --staged .

The --staged option tells git to only affect the staged changes and leave the working directory’s changes as they are.

Advanced Scenarios

In some cases, you might want finer control over the unstaging process. Here are some advanced scenarios and their solutions.

Unstage Files but Keep Them in Index

In some situations, you may want to unstage files but also keep them indexed. This might be useful for when you add a large number of files and want to break down the commit:

git add .
git reset HEAD --<file>

This sequence of commands will keep the files in the index, but will not have them being prepared for commit.

Interactive Unstage

To unstage files interactively, use the -i flag with the git reset command:

git reset -i HEAD

This lets you selectively unstage files through a CLI menu interface. Select the files you want to unstage by marking them and continue.

Handling Special Cases

There are some special cases that can arise while unstaging. This section will cover how to approach such scenarios.

Unstaging Renamed Files

If you stage a file and then rename it, unstaging it requires you to refer to the new filename, as Git tracks content rather than specific files:

git mv original_filename.txt new_filename.txt
git reset HEAD new_filename.txt

Unstaging Deleted Files

When you delete a file and stage that deletion, unstaging requires a slightly different approach:

git rm --cached deleted_file.txt

This removes the file from the staging area but doesn’t delete it from your working directory.

Conclusion

To effectively work with Git, knowing how to manage your staging area is critical. Whether you have accidentally staged a file that wasn’t ready or you simply changed your mind, you now have several options to undo the add and unstage your files, keeping your commit history clean and organized.