Предупреждение: не используйте следующую команду, если не хотите потерять незавершенную работу!
Использование git reset
было объяснено, но вы также запросили объяснение переданных команд, поэтому здесь идет речь:
git ls-files -z | xargs -0 rm -f
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
Команда git ls-files
выводит список всех файлов, о которых знает git. Опция -z
налагает на них определенный формат, ожидаемый xargs -0
формат, который затем вызывает для них rm -f
, что означает удаление их без проверки вашего одобрения.
Другими словами, «перечислите все файлы, которые знает git и удалите вашу локальную копию».
Затем мы переходим к git diff
, который показывает изменения между различными версиями элементов, о которых знает git. Это могут быть изменения между разными деревьями, различия между локальными и удаленными копиями и т. Д.
Как здесь используется, он показывает неустановленные изменения; файлы, которые вы изменили, но еще не зафиксировали. Опция --name-only
означает, что вам нужны только (полные) имена файлов, а --diff-filter=D
означает, что вы заинтересованы только в удаленных файлах. (Эй, разве мы не удалили кучу вещей?)
Затем он попадает в xargs -0
, который мы видели ранее, что вызывает git rm --cached
для них, что означает, что они удаляются из кэша, а рабочее дерево должно быть оставлено в покое - за исключением того, что вы только что удалили все файлы из вашего рабочее дерево. Теперь они также удалены из вашего индекса.
Другими словами, все изменения, поэтапные или неустановленные, пропали, и ваше рабочее дерево пусто. Плачите, проверяйте свои файлы, свежие из источника или удаленного, и переделайте свою работу. Прокляни садиста, который написал эти адские строки; Я понятия не имею, почему кто-то хотел бы сделать это.
TL; DR: вы просто все надули; начните сначала и используйте git reset
с этого момента.