How to undo ‘git add’ before commit ?
Try this solution:
You can undo git add before commit with
git reset <file>
Whichever will remove it from the current index the “about to be committed” list without changing anything else.
We can use
After any file name to unstage all due changes. This can come in handy when there are too many files to be listed one by one in a reasonable amount of time.
In early versions of Git, the above commands are equivalent to git reset HEAD <file>and git reset HEAD respectively, and will fail if HEAD is undefined incase you haven’t yet made any commits in repo or ambiguous to create a branch called HEAD. This was changed in Git 1.8.2,now latest versions of Git can use the commands above even prior to making your first commit:
“git reset” without options or parameters used to error out when you do not have any commits in your history.
Try this you want:
git rm --cached <added_file_to_undo>
That was my first try
git reset .
Undo my entire initial add, only to get this not so helpful message:
fatal: Failed to resolve 'HEAD' as a valid ref.
Turns out that this is because the HEAD ref doesn’t exist until after the first commit. That is, you will run into the same beginner’s problem as me if your workflow, like mine, was something like:
- cd to my great new project directory to try out Git, the new hotness
- git init
- git add .
- git status
- google “undo git add”
- git reset .
Alone with that the correct solution was right there in the Git status output which, yes, I glossed over as ‘crap.
... # Changes to be committed: # (use "git rm --cached <file>..." to unstage) ...
this solution indeed is to use git rm –cached FILE.
Note the warnings here – git rm deletes your local working copy of the file, but not if you use –cached. Here’s the result of git help rm:
I advance to use
git rm --cached .
To remove everything and start again while add . is recursive, turns out rm needs -r to recurse. Sigh.
git rm -r --cached .
To do a dry run and see what will be added:
git add -n .
I zipped up everything to a safe place before trusting git help rm about the –cached not destroying anything and what if I misspelled it.
Try this solution:
To resolve: git add moves changes from the current working directory to the staging area
This process is called staging. So the most natural command to stage the changes (changed files) is the obvious one:
git stage git add is just an easier to type alias for git stage
Pity there is no git unstage nor git unadd commands. The relevant one is harder to guess or remember, but is pretty obvious:
git reset HEAD --
We can easily create an alias for this:
git config --global alias.unadd 'reset HEAD --' git config --global alias.unstage 'reset HEAD --'
And final, we have new commands:
git add file1 git stage file2 git unadd file2 git unstage file1
specially I use even shorter aliases:
git a #for staging git u #for unstaging