Команда:
git checkout -- path/to/file.ext
копирует содержимое path/to/file.ext
из промежуточной области в рабочее дерево. Он не изменяет содержимое, хранящееся в промежуточной области, и его повторное выполнение должно не иметь никакого значения: копирование из промежуточной области в рабочее дерево, а затем повторное копирование из промежуточной области в рабочую область. дерево, должно привести к тому же содержанию рабочего дерева на второй копии, что и на первой.
Обратите внимание, что существует третья версия файла - ну, на самом деле, мы должны назвать ее first , - это копия, которая находится в текущем коммите . Когда вы проверяете коммит, Git:
- копирует содержимое каждого файла, сохраненного в этом коммите, в вашу промежуточную область и (одновременно)
- копирует содержимое каждого такого файла в ваше рабочее дерево.
Это означает, что существует три активных версии файла постоянно:
HEAD:path/to/file.ext
: этот файл доступен только для чтения, постоянно хранится в коммите, в специальной сжатой форме только для Git. Например, используйте git show HEAD:path/to/file.ext
.
:path/to/file.ext
: это чтение / запись, а не постоянное. Он хранится в промежуточной области (также называемой index или иногда cache ), также в специальной сжатой форме только для Git. Разница между этим и первым файлом заключается в том, что этот файл можно перезаписать, и все, что находится в копии индексной / промежуточной области, - это то, что войдет в следующий сделанный вами коммит. Используйте git show :path/to/file.ext
, чтобы увидеть эту копию.
Использование git add path/to/file.ext
копирует версию рабочего дерева в область index / staging.
Использование git checkout -- path/to/file.ext
копирует версию индексной / промежуточной области в рабочее дерево.
Использование git reset path/to/file.ext
копирует версию HEAD:path/to/file.ext
из коммита в область index / staging, не затрагивая версию рабочего дерева.
Последнее, есть версия рабочего дерева, path/to/file.ext
. Этот файл хранится в обычном формате вашего компьютера, чтобы вы и ваш компьютер могли работать с ним.
(Если вы хотите скопировать HEAD
версию файла в и индексную / промежуточную область и рабочее дерево, вы можете сделать это с помощью git checkout HEAD path/to/file.ext
.)
Обратите внимание, что когда вы запускаете git status
, фактически запускаются две разницы:
HEAD
против индекса: все, что здесь отличается, «подготовлено для фиксации».
- Индекс по сравнению с рабочим деревом: все, что здесь отличается, «не подготовлено для фиксации».
Вы никогда не увидите индекс / промежуточную область напрямую: вы видите его только по сравнению с коммитом HEAD
или по сравнению с рабочим деревом. Это имеет смысл, поскольку в большом проекте в области index / staging-области постоянно находятся тысячи файлов, но обычно только несколько из них отличаются от текущего коммита, рабочего дерева или обоих.