Файловая система Git и команды
Как уже упоминалось ранее, у Git есть три основных состояния, в которых могут находиться ваши файлы: изменён (modified), индексирован (staged) и зафиксирован (committed).
Давайте посмотрим как в эти состояния можно переходить с помощью команд.
Изменение состояний с помощью команд (источник: tproger.ru):

На иллюстрации:
- рабочая директория (файловая система вашего компьютера);
- область подготовленных файлов (staging area, хранит содержание следующего коммита);
- HEAD (последний коммит в репозитории).
Все основные команды по работе с файлами сводятся к пониманию тог о, как Git управляет этими тремя разделами. Существует распространённое заблуждение, что область подготовленных файлов только хранит изменения. Лучше думать об этих трёх разделах как об отдельных файловых системах, каждая из которых содержит свои копии файлов.
Предположим, что у нас в локальном репозитории:

git resetСброс текущей HEAD в заданное состояние
Документация здесь.
Выполним команду:
git reset HEAD^ --soft
Статус репозитория:

Добавим файл в индекс:
git add README
Статус репозитория:

Отменим готовность файла:
git reset HEAD README
Статус репозитория:

git add README
git checkoutПереключение ветвей или восстановление файлов рабочего дерева.
Документация здесь.
Добавим файл test.md:
echo "re" > test.md
Статус репозитория:

Выполним checkout:
git checkout README

checkout восстановил историческую ревизию файла README. А именно в выполненной команде файл восстановился до состояния, куда ука зывал HEAD. Фактически отменяются все локальные изменения, которые произошли с тех пор.
Иными словами git checkout <файл> без HEAD перезаписывает версию файла в рабочей директории версией в области подготовленных файлов, то есть отменяет изменения с момента последней подготовленной версии.
Если вы хотите восстановить определенную более раннюю ревизию, вы можете указать хэш SHA-1 этой ревизии.
Статус до внесения изменений:

Выполним checkout с указанием хэш SHA-1 первого коммита:
git checkout 02c9b2 README
Статус репозитория:

git diffпоказывает изменения между коммит, коммитом и рабочим деревом и т.д.
Документация здесь.
Чтобы посмотреть сами изменения, а не изменённые файлы, можно использовать следующие команды:
git diff— сравнение рабочей директории с областью подготовленных файлов;git diff --staged— сравнение области подготовленных файлов с HEAD.
Посмотрим изменения, которые были добавлены в индекс:
git diff --staged
Покажет изменения:
index 07c3486..78535a3 100644
--- a/README
+++ b/README
@@ -1 +1 @@
-There is a small exception to this, which is the detached HEAD. A detached HEAD is the situation you end up in whenever you check out a commit (or tag) instead of a branch. In this case, you have to imagine this as a temporary branch without a name; so instead of having a named branch reference, we only have HEAD. It will still allow you to make commits (which will update HEAD), so the above short definition is still true if you think of a detached HEAD as a temporary branch without a name.
\ No newline at end of file
+My Project 2
В более наглядном виде:

Подробнее о git diff в статье на pingvinus.ru.
Атрибуция
При подготовке статьи использован материал: