In git, is there any (simple) way to modify the index so that only changes to files which are already in it are added? It sounds kind of complicated, but what I want to achieve is simple.
Lets say my index looks like this (slightly stripped git status
output):
# Changes to be committed: # modified: A # modified: B # # Changed but not updated: # modified: B # modified: C # # Untracked files: # D
Some changes to B
are in the index, some aren't. C
is not staged at all.
How can I update B
in the index (stage its unstaged changes) without adding C
?
I.e. I would like for the index to look like this:
# Changes to be committed: # modified: A # modified: B # # Changed but not updated: # modified: C # # Untracked files: # D
In this simple case it can of course be achieved with a simple git add B
, but I would like to know if there's a simple answer for the general case. I tried git add --refresh
, but if I understand correctly, that only updates stat info.
The following command will update the index to contain the other changes in B that has not been staged yet:
git update-index --again
I don't know of a completely trivial way to do this, but:
git status --porcelain
will show file B (and only B) as state "MM", so:
git status --porcelain | grep ^MM | cut -d' ' -f 2
will produce a list of such files.
There's no harm in "re-adding" A, though.
You can also use git diff-index --cached --name-status HEAD
. (Might need this if your git is too old to have git status --porcelain
.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With