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.
(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.