Выровнять удаленный файл в git

Обычно, чтобы отменить изменения в файле, который вы сделали бы:

git checkout -- <file>

Что делать, если изменение, которое я хочу удалить, удаляет файл? Вышеприведенная строка даст ошибку:

error: pathspec '<file>' did not match any file(s) known to git.

Какая команда будет восстанавливать этот единственный файл, не отменяя другие изменения?

бонусная точка: Кроме того, что, если изменение, которое я хочу сбросить, добавляет файл? Я также хотел бы знать, как изменить это изменение.

Ответ 1

Предполагая, что вы хотите отменить эффекты git rm <file> или rm <file> а затем git add -A или что-то подобное:

# this restores the file status in the index
git reset -- <file>
# then check out a copy from the index
git checkout -- <file>

Чтобы отменить git add <file>, первая строка выше достаточно, если вы еще не сделали этого.

Ответ 2

Ответы на оба вопроса даны в git status.

Чтобы отключить добавление нового файла, используйте git rm --cached filename.ext

# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   test

Чтобы отключить удаление файла, используйте git reset HEAD filename.ext

# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    test

С другой стороны, git checkout -- никогда не останавливается, он просто отбрасывает нестроенные изменения.

Ответ 3

Ответы на ваши два вопроса связаны. Я начну со второго:

После того, как вы поставили файл (часто с git add, хотя некоторые другие команды неявно ставят также изменения, например git rm), вы можете отменить это изменение с помощью git reset -- <file>.

В вашем случае вы должны были использовать git rm для удаления файла, что эквивалентно простому его удалению с помощью rm и последующему этапу изменения. Если вы сначала отключите его с помощью git reset -- <file>, вы можете восстановить его с помощью git checkout -- <file>.

Ответ 4

Если он был поставлен и зафиксирован, то будет reset файл:

git reset COMMIT_HASH file_path
git checkout COMMIT_HASH file_path
git add file_path

Это будет работать для удаления, которое произошло за несколько предшествующих транзакций.