git: скасувати всі робочі зміни режиму, включаючи нові файли


1151

Як видалити всі зміни з робочого каталогу, включаючи нові незатребувані файли. Я знаю, що git checkout -fце робить, але це не видаляє нові незатребувані файли, створені з моменту останньої фіксації.

Хтось має ідею, як це зробити?


1
@Joel і Wayfarer: чому б вам не спробувати git help resetіgit help clean
— SHernandez

3
Створити псевдонім для цього у своєму git config - це гарна ідея;)
— anubina

Відповіді:


1699
git reset --hard # removes staged and working directory changes

## !! be very careful with these !!
## you may end up deleting what you don't want to
## read comments and manual.
git clean -f -d # remove untracked
git clean -f -x -d # CAUTION: as above but removes ignored files like config.
git clean -fxd :/ # CAUTION: as above, but cleans untracked and ignored files through the entire repo (without :/, the operation affects only the current directory)

Щоб побачити, що буде видалено попередньо, не фактично видаляючи його, використовуйте -nпрапор (це в основному тестовий запуск). Коли ви готові фактично видалити, тоді видаліть -nпрапор:

git clean -nfd


16
Примітка: скидання git - Hard видаляє поетапні зміни, а також зміни робочого каталогу. Крім того, git clean -f -d, мабуть, є кращою протилежністю додаванню нового незатребуваного файлу. З питання, запитувач може бути цілком задоволений своїм нинішнім набором ігнорованих файлів.
— CB Bailey

7
Прочитайте наступну відповідь і стежте за перемикачем -x. (Також може видалити локальну конфігурацію, таку як файли налаштувань пароля / db. Напр. Database.yml)
— Борис

9
Цей -x перемикач є непотрібним і дещо небезпечним у цьому випадку.
— Тім Готьє,

66
git clean -fxdнасправді може бути дійсно небезпечним, якщо ви не знаєте, що робите. Ви можете назавжди видалити деякі дуже важливі відслідковувані файли, наприклад, вашу базу даних тощо. Будьте обережні.
— Мейсон Стюарт

10
Зверніть увагу, що git clean -f -dфайли також видаляються з ігнорованих папок. Тож усі ваші локальні журнали та подібні речі не зникнуть. Зазвичай це не велика проблема, але краще знати.
— cyriel

299

Найбезпечніший метод, який я часто використовую:

git clean -fd

Пояснення синтаксису на /docs/git-cleanсторінці:

  • -f(псевдонім:) --force. Якщо для змінної конфігурації Git clean.requireForce не встановлено значення false, git clean відмовиться видаляти файли або каталоги, якщо не вказано -f, -n або -i. Git відмовиться видаляти каталоги з .git підкаталога або файлу, якщо не буде вказано другу -f.
  • -d. Видаліть незатрековані каталоги на додаток до файлів, що не відслідковуються. Якщо каталог без відстеження керується іншим сховищем Git, він не видаляється за замовчуванням. Використовуйте параметр -f двічі, якщо ви дійсно хочете видалити такий каталог.

Як згадувалося в коментарях, можливо, бажано робити операцію, git clean -ndяка виконує сухий запуск, і розповість, що було б видалено, перш ніж його фактично видалити.

Посилання на git cleanсторінку документа: https://git-scm.com/docs/git-clean


124
Я завжди git clean -nd .перед тим, як фактично видаляти файли, використовуючиgit clean -fd .
— tbear

14
Чому? Чи можете ви пояснити, будь ласка, деталі.
— Грег Б

31
Per мерзотника чистої опції -n фактично всуху , яка не видаляє нічого, він просто показує, що буде зроблено.
— RNickMcCandless

2
@tbear, Ви завжди можете зробити порожній add -A+ commit -a+ revert headспочатку раніше git clean. Перегляд кожного видалення просто не підходить для основних сценаріїв. Крім того, сухий біг не є срібною кулею: що робити, якщо ви щось пропустили або помилилися під час огляду?
— Пейсьєр

1
Це видаляє файли, але не скасовує модифікації.
— donquixote

202

Для всіх нестандартних файлів використовуйте:

git checkout -- .

В .кінці важливо.

Ви можете замінити .ім'я підкаталогу, щоб очистити лише певний підкаталог вашого проекту. Проблема розглядається саме тут .


7
@Vincent: - уникає введення помилок, повідомляючи команду оформлення замовлення, що більше ніяких параметрів не вказано. Без них ви могли б закінчити нову гілку замість того, щоб скинути поточну!
— Ігор Родрігес

2
Це найбезпечніший шлях, але він не видалить незатребувані файли (нещодавно додані файли).
— TinkerTenorSoftwareGuy

5
Це не відновлює видалені, ще не завантажені файли.
— Серін

Просто FYI. Я пропустив це. Переконайтеся, що ви знаходитесь в каталозі, який ви хочете видалити нестандартними змінами. Наприклад, у мене були зміни у двох різних файлах у різних місцях гілки, тобто: src/app/work/filename.jsі ../app/working/test/filename.js. Просто за git checkout -- .допомогою гілки вилучив лише перший файл ( без ведучого ../ ). Тому мені довелося перейти cd ../в другий каталог місцеположення, щоб видалити другий файл за допомогою цієї команди.
— Chris22

57

Погляньте на git cleanкоманду.

git-clean - Видаліть неробочені файли з робочого дерева

Очищає робоче дерево, рекурсивно видаляючи файли, які не перебувають під контролем версій, починаючи з поточного каталогу.

Зазвичай видаляються лише файли, невідомі для git, але якщо вказано параметр -x, ігноровані файли також видаляються. Наприклад, це може бути корисно для видалення всіх будівельних виробів.


Я спробував git clean -iі вибрав "очистити" з меню - це остаточно видалило нові файли.
— Sany

42

Наступні роботи:

git add -A .
git stash
git stash drop stash@{0}

Зауважте, що це скасує нестаціонарні та поетапні локальні зміни. Отже, перед тим, як виконати ці команди, вам слід зробити все, що ви хочете зберегти.

Типовий випадок використання: ви перемістили багато файлів чи каталогів, а потім хочете повернутися до початкового стану.

Кредити: https://stackoverflow.com/a/52719/246724


1
Чому ви посилаєтесь на скриньку @ {0}, а не просто git stash drop?
— maikel

Чесно кажучи, я не пам’ятаю :)
— donquixote

Цей працював. В якості примітки переконайтеся, що ви перебуваєте в домашньому каталозі ( git add -A .). Я втратив 30 м, тому що файлу не було. Дякую!
— user9869932

Раніше я використовував такий підхід, і в цьому є заслуга. Однак я знайшов рішення, запропоновані jfountain та Хітом Даттоном, більш вподобаними до початкової проблеми, IMHO.
— HeyZiko

2
git stash drop stash @ {0} випадає останнє сховище, якщо ви зробите git stash, воно б
— викинуло

42

Це можна зробити в два етапи:

  1. Відновити змінені файли: git checkout -f
  2. Видаліть незатребувані файли: git clean -fd

3
+1, тому що просто. Крім того, що він працює і робить саме те, що OP хоче, не відлякуючи їх omg, це видалить усе.
— geekzster

30

Я думав , що це було ( попередження: наступний буде знищити все )

$ git reset --hard HEAD
$ git clean -fd

Зміни resetдля скасування змін. clean, Щоб видалити будь-який неотслежіваемих F Ільзе і г irectories.


Це не спрацьовує, я все одно отримую попередження про конфлікт, роблячи це git pullпісля цього: CONFLICT (content): Merge conflict in...я вирішив це лише черезgit pull --strategy=ours
— rubo77


4

git clean -iспочатку покаже вам елементи, які потрібно видалити, і продовжуватиметься після підтвердження. Я вважаю це корисним при роботі з важливими файлами, які не слід видаляти випадково.

Див. Для git help cleanотримання додаткової інформації, включаючи деякі інші корисні варіанти.


4

Якщо ви хочете відмовитись від усіх змін, ви можете використовувати будь-який із дійсних параметрів у псевдонімі в .gitconfig. Наприклад:

[alias]
    discard = "!f() { git add . && git stash && git stash drop stash@{0}; }; f"

Використання: git discard


1
Цей псевдонім мені дуже подобається
— прапори

3

Альтернативне рішення - здійснити зміни, а потім позбутися цих зобов'язань. Спочатку це не має негайної вигоди, але це відкриває можливість робити фішки і створювати тег git для резервного копіювання.

Ви можете це зробити на поточній гілці, наприклад:

git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git revert HEAD
git reset HEAD^^

Або ви можете зробити це на відокремленій голові. (якщо припустити, що ви починаєте з відділення BRANCHNAME):

git checkout --detach HEAD
git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git checkout BRANCHNAME

Однак те, що я зазвичай роблю, - це робити фішки, а потім називати деякі чи всі зобов’язання як "Відхилити: ...". Потім використовуйте інтерактивну базу даних, щоб видалити погані зобов'язання та зберегти хороші.

git add -p  # Add changes in chunks.
git commit -m"DISCARD: Some temporary changes for debugging"
git add -p  # Add more stuff.
git commit -m"Docblock improvements"
git tag archive/local-changes-2015-08-01
git rebase -i (commit id)  # rebase on the commit id before the changes.
  # Remove the commits that say "DISCARD".

Це більш багатослівно, але дозволяє переглянути, які саме зміни потрібно відмовити.

Ці git lolтаgit lola ярлики були дуже корисні з цим робочим процесом.


3

Для конкретної папки я використав:

git checkout -- FolderToClean/*

3
Це не видаляє незатрековані файли, як заявляє ОП.
— vonbrand

0

Це, мабуть, відповідь noob, але: я використовую TortoiseGit для Windows, і він має гарну функцію під назвою REVERT. Отже, що потрібно зробити, щоб відновити локальні нестандартні незапущені зміни:

  1. виберіть контекстне меню для потрібної папки та виберіть відновити, воно показує спливаюче вікно відновлення, де ви можете вибрати змінені файли для відновлення / відновлення.
  2. Якщо ви також хочете видалити додані файли (які ще не знаходяться в git), натисніть команду зафіксувати (з того самого контекстного меню), вона відкриває спливаюче вікно "Здійснення" і покаже додані файли, потім клацніть правою кнопкою миші кожен з них і виберіть "Видалити". Але не натискайте Команда btn у цьому спливаючому віці, оскільки ви не хочете виконувати, а бачити лише додані файли та видаляти їх звідси.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.