Unstage удаленный файл в Git - PullRequest
439 голосов
/ 07 марта 2012

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

git checkout -- <file>

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

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

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

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

Ответы [ 4 ]

679 голосов
/ 07 марта 2012

Предполагая, что вы хотите отменить эффекты 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>, достаточно первой строки выше,при условии, что вы еще не совершали.

49 голосов
/ 07 марта 2012

Ответы на оба вопроса: 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 -- никогда не нестандартный, он просто отбрасывает не поэтапные изменения.

10 голосов
/ 07 марта 2012

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

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

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

7 голосов
/ 10 августа 2017

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

git reset COMMIT_HASH file_path
git checkout COMMIT_HASH file_path
git add file_path

Это будет работать для удаления, которое произошло несколькими коммитами предыдущего.

...