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.