2012-03-06 2 views
311

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

git checkout -- <file> 

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

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

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

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

+1

Отбрасывание изменений и непоставок - это две разные вещи, которые вы пытаетесь сделать? –

+0

Это два разных вопроса и проблем в одном сообщении. Это делает ответы слишком много и излишне запутывает. –

ответ

457

Предполагая, что вы желая устранить последствия «мерзавец ет» или «ет», а затем «мерзавцем добавить -A» или что-то подобное:

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

Чтобы отменить «мерзавец добавить», то первое строка выше достаточно, если вы еще не сделали этого.

+1

Отличный ответ! –

+21

«-» - это ключ. 'git reset ' не работает, вот что привело меня сюда. –

+0

Работает отлично. Может ли это быть сконденсировано в одну команду? –

38

На оба вопроса отвечает 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 1.7.2.5 на Debian. – tripleee

7

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

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

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

0

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

git reset COMMIT_HASH file_path 
git checkout COMMIT_HASH file_path 
git add file_path 

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

Смежные вопросы