The Git workflow typically involves modifying files in your working directory and then using git add to place specific changes into the staging area, preparing them for the next commit. However, sometimes you might add a file to the staging area and then change your mind. Perhaps you added it by mistake, or maybe the changes aren't quite ready to be permanently recorded in the project history.
Git provides a way to "unstage" files, effectively removing them from the staging area without discarding the changes you've made to the actual file in your working directory. The command for this is git reset HEAD <file>.
git reset HEAD <file>Let's break down this command:
git reset: This is a versatile command used for undoing changes. It has different modes, but when used with HEAD and a file path, it specifically affects the staging area.HEAD: In Git, HEAD is typically a pointer to the most recent commit on your current branch. Think of it as representing the last saved state of your project in the repository.<file>: This is the name of the file (or files) you want to remove from the staging area.When you run git reset HEAD <file>, you're telling Git: "For this specific file, reset its state in the staging area to match the version that's stored in the HEAD commit."
The important point here is that this command only changes the staging area (also called the index). It does not change the contents of the file in your working directory. If you had modifications in <file> when you staged it, those modifications will still be there after you unstage it; Git simply removes it from the list of changes scheduled for the next commit.
The basic syntax is:
git reset HEAD <path/to/your/file>
You can specify multiple files:
git reset HEAD file1.txt path/to/another/file2.js
If you want to unstage all currently staged files, you can omit the file path:
git reset HEAD
This is useful if you've staged several files with git add . and then realize you want to create a more focused commit with only a subset of those changes.
Imagine you're working on a project. You've modified two files: index.html and style.css.
You decide to stage both for commit:
# Check status - both modified but not staged
git status
# Stage both files
git add index.html style.css
# Check status again - both staged
git status
Your git status output would now show index.html and style.css under "Changes to be committed".
You review the changes and realize that the modifications in style.css are experimental and shouldn't be included in this commit. You want to unstage it but keep the changes you made to the file.
Use git reset HEAD for the specific file:
git reset HEAD style.css
Check the status again:
git status
Now, git status will show:
index.html under "Changes to be committed" (it's still staged).style.css under "Changes not staged for commit" (it's unstaged, but Git recognizes it's still different from the version in the last commit).Your style.css file in the working directory remains exactly as you last edited it. You've simply removed it from the staging area. You can now proceed to commit only index.html, or continue working on style.css and stage it again later when it's ready.
Diagram illustrating the process: Changes are added from the Working Directory to the Staging Area.
git reset HEAD style.cssmovesstyle.cssout of the staging area, leaving it modified in the Working Directory, whileindex.htmlremains staged. A subsequent commit would only includeindex.html.
Using git reset HEAD <file> is a common operation when refining your commits. It gives you precise control over what gets included in the next snapshot of your project history, allowing you to undo the staging step without losing your work.
Was this section helpful?
git reset command, detailing its various modes and options, including how to unstage files.git reset and its different uses, including unstaging changes from the index.git reset command with clear examples and diagrams, suitable for beginners learning to manage their staging area.© 2026 ApX Machine LearningEngineered with