Чтобы добавить немного к ответу Рона Набуурса , обратите внимание, что git commit
получает содержимое фиксации из индекса Git, а не из рабочего дерева. (Индекс также называется промежуточной областью и иногда кешем .) Когда вы запускаете git add <em>file</em>
, Git копирует содержимое данного file
из рабочего дерева в указатель.
Если некоторые из ваших файлов рабочего дерева повреждены, но версии индекса не повреждены, вы можете просто не запускать git add
для файлов рабочего дерева. Версии индекса остаются без изменений, и git commit
будет их использовать.
Если версия индекса также повреждена, но версия HEAD
не повреждена, вы можете указать Git скопировать версию HEAD
в индекс, используя git reset
, как показал Рон: git reset <em>file</em>
.
Думайте об индексе как о "сидящем" между текущим (HEAD
) коммитом и рабочим деревом, потому что он делает:
HEAD commit index work-tree
----------- --------- ---------
README.md README.md README.md
file.ext file.ext file.ext
Операция, которая копирует из рабочего дерева в индекс, - git add
, а операция, которая копирует из фиксации в индекс - git reset
.
(Любой зафиксированный файл по определению доступен только для чтения, поэтому нет операции для копирования из индекса в коммит. Конечно, вы можете сделать новый коммит, который станет вашим HEAD
коммитом, используя git commit
, чтобы превратить индекс в коммит.)
Также возможно копировать из любого коммита в рабочее дерево, используя git checkout
в форме команды git checkout <em>commit</em> -- <em>file</em>
. Однако обратите внимание, что когда вы делаете это, git checkout
сначала копирует файл из данного коммита в индекс, затем из индекса в рабочее дерево, так что этот тип копирования заменяет index и версии рабочего дерева.