The git add
command runs blind, but can be controlled with more fine-grained
precision using the --patch
option. This works great for modified and deleted
files, but untracked files do not show up.
$ echo "Hello, World!" > untracked
$ git status --short
?? untracked
$ git add --patch
No changes.
To remedy this, the --intent-to-add
option can be used. According to
git-add(1)
, --intent-to-add
changes git add
‘s behavior to:
Record only the fact that the path will be added later. An entry for the path is placed in the index with no content. This is useful for, among other things, showing the unstaged content of such files with git diff and committing them with git commit -a.
What this means is that after running git add --intent-to-add
, the specified
untracked files will be added to the index, but without content. Now, when git
add --patch
is run it will show a diff for each previously staged untracked
file with every line as an addition. This gives you a chance to look through the
file, line by line, before staging it. You can even decide not to stage specific
lines by deleting them from the patch using the edit command.
$ echo "Hello, World!" > untracked
$ git status --short
?? untracked
$ git add --intent-to-add untracked
$ git status --short
AM untracked
$ git add --patch
diff --git a/untracked b/untracked
index e69de29..8ab686e 100644
--- a/untracked
+++ b/untracked
@@ -0,0 +1 @@
+Hello, World!
Stage this hunk [y,n,q,a,d,/,e,?]?
In my .gitconfig
I alias add --all --intent-to-add
to aa
and add --patch
to ap
which means that for most commits, I type:
git aa
git ap
Or in gitsh
:
& aa
& ap