Попередження: не використовуйте таку команду, якщо ви не хочете втратити роботу, що не працює!
Використання 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з цього моменту.
rm -fне є командою git і не має--cachedможливості. Ваші локальні файли були видалені перед виконанням,git rmтому я не думаю, що ви можете законно звинувачуватисьgit rmу чомусь.