How to track but not stage and how to unstage but not untrack?

I have two concise questions:

  • How I can track files but without staging them ?
  • How I can unstage files for commit without untracking them ?

NOTE: I know that I can do an initial commit to track the files and start from there with my files tracked. But is possible to specifically do what I'm asking above ?

I tried to use git add -N <expr> but it tracks the file and add it for commit:

PS C:\> git add -N fileA
PS C:\> git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   fileA
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   README.md
#       modified:   composer.lock
#       modified:   fileA
#

If I do git reset HEAD fileA or git rm --cached fileA unstages it but also untracks the file. This command git rm fileA suggest me to use the flag -f that removes the file fisically.

So, It is possible to only track but not stage, and to only unstage but not untrack files ?


Update (May 2015)

I tried to use git add -N <expr> but it tracks the file and add it for commit:

That is no longer the case with the upcoming Git 2.5 (Q2 2015).
See "File doesn′t get into the commit after using git add -N"


Original answer (March 2013)

How I can unstage files for commit without untracking them ?

this is the official way:

git reset HEAD fileA

But since it is a new file, you would untrack it as well (remove it from the index, without any previous commit referencing it).

Starting tracking a file means having it in a index (stage) or a commit.

I would recommend making a branch for those files, in order to add them/commit them there.
See "What is Tracked files and Untracked files in the context of GIT?"

  • Tracked files are files that were in the last snapshot; they can be unmodified, modified, or staged.
  • Untracked files are everything else — any files in your working directory that were not in your last snapshot and are not in your staging area (index)

That means that, for a new file, unstaged it means untrack it.

tracked files in git
(Source: Pro Git Book, 2.2 Git Basics - Recording Changes to the Repository)
(Thank you, louisfischer, for the update/fix in the comments)

See also "git - how to tell if a file is git tracked (by shell exit code)?".


Track all of your files with git add. Commit all of the changes you want to commit and push to remote. Then stash your new file with git stash. Your file will be tracked but not committed. So in your example you would start by un-staging fileA. Then run git add README.md and git add composer.lock. git commit -m "Committing fun stuff.". Now we need to track the new file without staging it so we simply do git add fileA followed by git stash. When you're ready to commit fileA you can run git stash pop to commit/push to remote.