How to remove a file from the last commit in Git?

This is a question of moving the mistakenly committed files back to the staging area from the previous commit, without canceling the changes done to them. This can be done like this:

git reset --soft HEAD^ 

or

git reset --soft HEAD~1

Then reset the unwanted files in order to leave them out from the commit (the old way):

git reset HEAD path/to/unwanted_file

Note, that since Git 2.23.0 one can (the new way):

git restore --staged path/to/unwanted_file

Now commit again, you can even re-use the same commit message:

git commit -c ORIG_HEAD  

How to remove a file from the last commit in Git?

If you only want to remove a file from your previous commit, and keep it on disk.

If this is your last commit and you want to completely delete the file from your local and the remote repository, you can:

  1. remove the file git rm <file>
  2. commit with amend flag: git commit --amend

The amend flag tells git to commit again, but “merge” (not in the sense of merging two branches) this commit with the last commit.

Using git rm here is like using the rm command itself!

How to remove a file from an old commit in Git?

Existing answers are all talking about removing the unwanted files from the last commit.

If you want to remove unwanted files from an old commit (even pushed) and don’t want to create a new commit, which is unnecessary, because of the action:

  1. Find the commit that you want the file to conform to using ;

git log --graph --decorate --oneline

  1. Checkout that commit using

git checkout <commit_id> <path_to_file>

you can do this multiple times if you want to remove many files.

3.

git commit -am "remove unwanted files"

4.

Find the commit_id of the commit on which the files were added mistakenly, let’s say “35c23c2” here

git rebase 35c23c2~1 -i // notice: "~1" is necessary

This command opens the editor according to your settings. The default one is vim. If you want to change the global git editor, use;

git config --global core.editor <editor_name>

5.

Move the last commit, which should be “remove unwanted files”, to the next line of the incorrect commit(“35c23c2” in our case), and set the command as fixup:

pick 35c23c2 the first commit
fixup 0d78b28 remove unwanted files

You should be good after saving the file.

6.

To finish :

git push -f

If you, unfortunately, get conflicts, you have to solve them manually.

Answer #3:

You can do this by resetting the entire commit. But this is a rather heavy-handed approach.
A cleaner way to do this would be to keep the commit, and simply remove the changed files from it.

git reset HEAD^ -- path/to/file
git commit --amend --no-edit

The git reset will take the file as it was in the previous commit, and stage it in the index. The file in the working directory is untouched.
The git commit will then commit and squash the index into the current commit.

This essentially takes the version of the file that was in the previous commit and adds it to the current commit. This results in no net change, and so the file is effectively removed from the commit.

Answer #4:

If you have not pushed the changes on the server you can use

git reset --soft HEAD~1

It will reset all the changes and revert to one commit back.

How to remove a file from the last commit without using rm?

Removing the file using rm will delete it!

You’re always adding to a commit in git rather than removing, so in this instance return the file to the state it was in prior to the first commit (this may be a delete ‘rm’ action if the file is new) and then re-commit and the file will go.

To return the file to some previous state:

    git checkout <commit_id> <path_to_file>

or to return it to the state at the remote HEAD:

    git checkout origin/master <path_to_file>

then amend the commit and you should find the file has disappeared from the list (and not deleted from your disk!)

Answer #6:

The following will unstage just the file you intended, which is what the OP asked.

git reset HEAD^ /path/to/file

You’ll see something like the following…

Changes to be committed: (use “git reset HEAD …” to unstage)

modified: /path/to/file

Changes not staged for commit: (use “git add …” to update what will be committed) (use “git checkout — …” to discard changes in working directory)

modified: /path/to/file

  • “Changes to be committed” is the previous version of the file before the commit. This will look like a deletion if the file never existed. If you commit this change, there will be a revision that reverts the change to the file in your branch.
  • “Changes not staged for commit” is the change you committed, and the current state of the file

At this point, you can do whatever you like to the file, such as resetting to a different version.

When you’re ready to commit:

git commit --amend -a

or (if you’ve got some other changes going on that you don’t want to commit, yet)

git commit add /path/to/file
git commit --amend

Answer #7:

git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "removed unwanted file from git"

will leave you the local file still. If you don’t want the file locally either, you can skip the –cached option.

If all work is on your local branch, you need to keep the file in a later commit, and like having a clean history, I think a simpler way to do this could be:

git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit --squash <commit_id>
git add <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "brand new file!"
git rebase --interactive <commit_id>^

and you can then finish the rebase with ease without having to remember more complex commands or commit message or type as much.

Answer #8:

If you want to remove files from previous commits use filters

git filter-branch --prune-empty --index-filter 'git rm --ignore-unmatch --cached "file_to_be_removed.dmg"'

If you see this error:

Cannot create a new backup. A previous backup already exists in refs/original/ Force overwriting the backup with -f

Just remove refs backups on your local repo

$ rm -rf .git/refs/original/refs

How to remove files from git commit?

If you haven’t pushed your changes to git yet

git reset --soft HEAD~1

It will reset all the changes and revert to one commit back

If this is the last commit you made and you want to delete the file from local and remote repository try this :

git rm <file>
 git commit --amend

or even better :

reset first

git reset --soft HEAD~1

reset the unwanted file

git reset HEAD path/to/unwanted_file

commit again

git commit -c ORIG_HEAD  

Answer #9:

Had the same issue where I have changes in a local branch where I wanted to revert just one file. What worked for me was –

(feature/target_branch below is where I have all my changes including those I wanted to undo for a specific file)

(origin/feature/target_branch is the remote branch where I want to push my changes to)

(feature/staging is my temporary staging branch where I will be pushing from all my wanted changes excluding the change to that one file)

  1. Create a local branch from my origin/feature/target_branch – called it feature/staging
  2. Merged my working local branch feature/target_branch to the feature/staging branch
  3. Checked out feature/staging then git reset –soft ORIG_HEAD (Now all changes from the feature/staging’ will be staged but uncommitted.)
  4. Unstaged the file which I have previously checked in with unnecessary changes
  5. Changed the upstream branch for feature/staging to origin/feature/target_branch
  6. Committed the rest of the staged changes and pushed upstream to my remote origin/feature/target_branch

Hope you learned something from this post.

Follow Programming Articles for more!

About ᴾᴿᴼᵍʳᵃᵐᵐᵉʳ

Linux and Python enthusiast, in love with open source since 2014, Writer at programming-articles.com, India.

View all posts by ᴾᴿᴼᵍʳᵃᵐᵐᵉʳ →