Перейти к основному содержимому

Файловая система Git и команды

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

Давайте посмотрим как в эти состояния можно переходить с помощью команд.

Изменение состояний с помощью команд (источник: tproger.ru):

Изменение состояний

На иллюстрации:

  • рабочая директория (файловая система вашего компьютера);
  • область подготовленных файлов (staging area, хранит содержание следующего коммита);
  • HEAD (последний коммит в репозитории).

Все основные команды по работе с файлами сводятся к пониманию того, как Git управляет этими тремя разделами. Существует распространённое заблуждение, что область подготовленных файлов только хранит изменения. Лучше думать об этих трёх разделах как об отдельных файловых системах, каждая из которых содержит свои копии файлов.

Предположим, что у нас в локальном репозитории:

Пример 1

Команда git reset

Сброс текущей HEAD в заданное состояние

Документация здесь.

Выполним команду:

git reset HEAD^ --soft

Статус репозитория:

Пример 2

Добавим файл в индекс:

git add README

Статус репозитория:

Пример 3

Отменим готовность файла:

git reset HEAD README 

Статус репозитория:

Пример 4

git add README
Команда git checkout

Переключение ветвей или восстановление файлов рабочего дерева.

Документация здесь.

Добавим файл test.md:

echo "re" > test.md

Статус репозитория:

Пример 5

Выполним checkout:

git checkout README

Пример 6

checkout восстановил историческую ревизию файла README. А именно в выполненной команде файл восстановился до состояния, куда указывал HEAD. Фактически отменяются все локальные изменения, которые произошли с тех пор.

Иными словами git checkout <файл> без HEAD перезаписывает версию файла в рабочей директории версией в области подготовленных файлов, то есть отменяет изменения с момента последней подготовленной версии.

Если вы хотите восстановить определенную более раннюю ревизию, вы можете указать хэш SHA-1 этой ревизии.

Статус до внесения изменений:

Пример 7

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

git checkout 02c9b2 README

Статус репозитория:

Пример 8

Команда 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

В более наглядном виде:

Пример 9

Подробнее о git diff в статье на pingvinus.ru.

Атрибуция

При подготовке статьи использован материал: