Попередження: не використовуйте таку команду, якщо ви не хочете втратити роботу, що не працює!
Використання 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
у чомусь.