git reset --soft HEAD~1
сбрасывает только HEAD
в предыдущий коммит в то время как индекс и рабочий каталог не трогали.
Это означает, что индекс и рабочий каталог все еще отражает состояние, содержащее конфиденциальную информацию. Просто удалите эти файлы из индекса git reset HEAD <file>...
и совершите еще раз.
После удаления конфиденциальных файлов данных из индекса они останутся в рабочем каталоге. Возможно, вы также захотите удалить их из рабочего каталога или добавить их в .gitignore
.
EDIT
Вы хотите сказать, я должен сначала сделать мерзавец сброса --Мягкая ГОЛОВУ ~ 1, а затем GIT ГОЛОВУ сброса?
Да. Обычно вы создаете файлы git add ..
, а затем фиксируете их. Если вы делаете git reset --soft HEAD~1
, ваш репозиторий отражает состояние перед этим фиксацией. Вы можете увидеть это, если вы делаете git status
. Таким образом, вы можете изменить индекс и снова зафиксировать.
Кроме того, удаляет ли данные данные на 100% из истории git?
Нет, не полностью. Если фиксация больше не указана, git удалит ее после 90 дней (значение по умолчанию - см. git gc
). Если вы хотите удалить его немедленно, вы должны убедиться, что он больше не ссылается. Поэтому вы должны удалить его из любого содержащего его reflog, например. git reflog --delete [email protected]{3}
. Обычно он будет содержаться в блоке HEAD
и вашей ветке. Также убедитесь, что он не содержится ни в одной ветви, например. если фиксация if равна A
, выполните git branch -a --contains A
. Выход должен быть пустым.
Затем вы можете сбрасывать мусор, используя git gc --prune=now
. Убедитесь, что фиксация была удалена с использованием git log -n1 COMMIT-ID
. Он должен вывести fatal: bad object
.
Подробнее об удалении файлов и руководств от git см. В моем блоге https://www.link-intersystems.com/blog/2014/07/17/remove-directories-and-files-permanently-from-git/.
Почему мой пример недостаточно? git reset HEAD удаляет файл из истории, не так ли? Разве этого недостаточно? –
Mattias
@Mattias 'git reset HEAD -' только перезагружает файл, но не изменяет текущую фиксацию (которая по-прежнему включает ваш конфиденциальный файл). Вы могли бы совершить новую фиксацию без вашего файла, но история (предыдущая фиксация) все равно будет ссылаться на чувствительный файл. Чтобы действительно удалить его из истории, вам нужно повторить предыдущую фиксацию, а не только файл. –
VonC
Если я сделаю 'git reset --soft HEAD ~ 1', который сбрасывается на предыдущий фиксатор (тот, который был до того, как был запущен файл с чувством), а затем выполните сброс git HEAD -', который удалит чувствительную файл из индекса git, не получится ли я получить тот же результат, что и при выполнении 'git reset HEAD ~ 1', за исключением того, что я сохраняю все нечувствительные файлы в индексе? –
Mattias