I'm not sure if this is a bug or the intended behaviour. Here's my minimal reproduction (using python3 to write files so I can control line endings) ``` #!/bin/bash set -ex rm -rf repo git init repo cd repo git config --local core.autocrlf input python3 -c 'open("foo", "wb").write(b"1\r\n2\r\n")' git add foo python3 -c 'open("foo", "wb").write(b"3\r\n4\r\n")' git checkout-index --all --force echo 'I expect this `git status` to have no modifications' git status ``` Here's the output: ``` + rm -rf repo + git init repo Initialized empty Git repository in /tmp/foo/repo/.git/ + cd repo + git config --local core.autocrlf input + python3 -c 'open("foo", "wb").write(b"1\r\n2\r\n")' + git add foo warning: CRLF will be replaced by LF in foo. The file will have its original line endings in your working directory. + python3 -c 'open("foo", "wb").write(b"3\r\n4\r\n")' + git checkout-index --all --force + echo 'I expect this `git status` to have no modifications' I expect this `git status` to have no modifications + git status On branch master Initial commit Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: foo 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: foo ``` In this state, `git diff` and `git diff-index` disagree as well: ``` $ git diff-index --exit-code $(git write-tree) --patch; echo $? 1 $ git diff --exit-code; echo $? 0 ``` I expect the plumbing command `checkout-index -af` to exactly restore the disk state to the index such that `git status`, and `git diff-index` both indicate there are no changes. Interestingly, `git checkout -- .` does exactly this, but it is a porcelain command and not suitable for scripting. Alternatively, I'm looking for an equivalent to `git checkout -- .` which uses only plumbing commands. Thanks, Anthony