git checkout, clean, vs reset


This post goes over the difference between git checkout, git clean, and git reset:

They will be compared using the example below.

Example

Given the index and working tree:

git status
On branch master
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:   modified.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        untracked.txt

no changes added to commit (use "git add" and/or "git commit -a")

Or in the short format:

git status -s
 M modified.txt
?? untracked.txt

git checkout

Changes to modified files are discarded but untracked files are untouched:

git checkout .
git status -s
?? untracked.txt

See docs on git checkout for more info.

git clean

Untracked files are removed but modified files are unchanged:

git clean -f
Removing untracked.txt
git status -s
 M modified.txt

To remove untracked directories in addition to untracked files, run:

git clean -f -d

See docs on git clean for more info.

git reset

Changes to modified files are discarded but untracked files are untouched:

git reset --hard
HEAD is now at sha1234 my commit message
git status -s
?? untracked.txt

Thus, to discard modified files and remove untracked files:

git reset --hard && git clean -f -d

See docs git reset for more info.



Please support this site and join our Discord!