Выровнять удаленный файл в 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
Это будет работать для удаления, которое произошло за несколько предшествующих транзакций.