Питання Як відмовитися від непоправлених змін у Git?


Як відхилити зміни у моїй робочій копії, які не входять до індексу?


3869
2017-09-09 19:33


походження


Дивись також stackoverflow.com/questions/22620393/... - Cees Timmerman
git-clean лише видаляє невідслідувані файли з робочого дерева git-scm.com/docs/git-clean - Gboyega
Щоб прояснити коментар Асенара вище, git-clean -df може бути небезпечним. Він буде видаляти локальні файли, які не були відстежені (наприклад, охоплені .gitignore). Прочитайте все нижче уважно і розгляньте перевірку git. замість цього - jacanterbury
'git clean -df' Будьте обережні! Я спробував це, і втратив ключові папки, які не можуть бути відновлені ... Ой! - Gabe Karkanis
удар git status дає підказку про те, як це зробити! git checkout -- . - Paulo


Відповіді:


Ще один швидший шлях:

git stash save --keep-index

Включати --include-untracked якщо ви хочете бути впевненими в цьому.

Після цього ви можете скинути цей стишок за допомогою git stash drop команда, якщо вам подобається


2182
2017-09-09 19:39



І щоб бути ретельним про це, ви хотіли б --include-untrackedтак само. - T.J. Crowder
@KarimSamir: Питання конкретно просить про зміни, які є не в індексі. The git reset команда також відмовиться від змін в індексі. - Greg Hewgill
копія Git -. набагато швидше - Frank
Ні git stash, ніякої різноманітності git checkout відмовиться від непоправлених видалень. За даними випуску git status, актуальна правильна відповідь тут є деяким ароматом git reset HEAD - Chris Warth
Це забруднює стек укладання. git checkout -- . виконує роботу лише з однією командою. - Felipe Tonello


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

git checkout -- .

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

git checkout path/to/file/to/revert

Не забудьте включити період в кінці.


4197
2017-09-09 19:37



Це, здається, є канонічним способом. тобто саме те, що git вам повідомляє, якщо ви вводите git status - ABMagil
Не працює, якщо є файли, не відстежені. Гіт каже error: The following untracked working tree files would be overwritten by checkout: .... - Michael Iles
Питання про новачків, що таке "перевірка гіта -." означає семантично? - kaid
@Ninjack git checkout -- . означає те ж саме, що і git checkout ., за винятком того, що ви впевнені в тому, що ви не вказали назву галузі. Вони обидва кажуть, що виписують HEAD версію в галузі, в якій я зараз перебуваю за "." або "./". Якщо ти зробиш git checkout branch-name directory-or-file-name Загалом, ви отримуєте HEAD версію directory-or-file-name на філії branch-name. - akgill
ІМО цей варіант є недосконалим, оскільки він не справляється з ситуацією, коли ваш змінений репозиторій не знаходиться в редакції HEAD на момент очищення змін, і ви НЕ хочете оновити його в HEAD, і хочете просто очистити зміни. - alexykot


Здається, повне рішення є:

git clean -df
git checkout -- .

git clean видаляє всі не відстежені файли (УВАГА: поки не буде видалено ігноровані файли, згадані безпосередньо в .gitignore, він може видалити ігноровані файли, що знаходяться в папках) та git checkout очищає всі незахищені зміни.


1615
2017-08-29 18:28



Інші два відповіді насправді не працюють, це робиться. - John Hunt
@dval це пов'язано з тим, що перша команда видаляє неіндексовані файли, а другий видаляє невстановлені зміни (індексованих файлів). Отже, якщо у вас не було поетапних змін, це буде таким самим, як і повернення до останньої фіксації з git reset --hard - Amanuel Nega
використовувати -dff якщо невстановлений каталог - це кіт git. - accuya
Будьте обережні, працюючи git clean -df. Якщо ви не розумієте, що це робить, ви можете видалити файли, які ви хочете зберегти, як-от robots.txt, завантажені файли тощо. - ctlockey
Як сказав @ctlockey, перша команда теж видалити каталоги, якщо вони складаються лише з ігноруваних файлів... Загублений цілий купа файлів конфігурації на моєму проекту :( Будьте обережні. - Maxime Lorant


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

git checkout .

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

git checkout-index -a -f

274
2018-06-20 10:28



Привіт, яка різниця між ними git checkout . і git checkout -- .? - Evan Hu
@ Еван: У цьому випадку немає різниці. - Robert Siemer
@ Роберт Сімер та у загальному випадку? - RJFalconer
@ Еван: погане місце, щоб задавати це питання. - Це не має відношення до питання ОП, і не має відношення до відповіді тут. - Robert Siemer
+1 Це ПРАВО ВІДПОВІДЬ, оскільки він правильно обробляє випадок, коли обидва файли встановлені одночасно і нестандартні зміни. Зауважте, що це рішення ВИДАЛУЄ нестабілізовані зміни; якщо ви хочете зберегти їх, тоді ви повинні використовувати @ greg-hewgill відповідь git stash save --keep-index. - Rhubbarb


git clean -df

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

-d: Видаліть нераскрытые каталоги на додаток до файлів, що не були відстежені

-f: Сила (може бути не обов'язково в залежності від clean.requireForce настройка)

Біжи git help clean щоб побачити посібник


210
2017-12-07 13:09



чому ця відповідь не має всіх голосів? Відповів ще в 2011 році і все ще правильно. - Eugene Braginets


Мій улюблений є

git checkout -p

Це дозволяє вибірково повертати шматочки.

Дивись також:

git add -p

82
2017-10-10 12:31



Я люблю можливість бачити фактичні зміни, перш ніж його відкинути. - Penghe Geng
Це те, що я використовую. git checkout -p, а потім "a" прийняти все. - Mattis
Я ніколи не думав про це. Це -p додає хороший додатковий рівень безпеки. Поєднайте його git clean -d насправді відповісти на ОП. - Stephan Henningsen


Оскільки ніякої відповіді не вказує на точну комбінацію варіантів, яку я використовую, ось це:

git clean -dfx
git checkout .

Це онлайн-довідковий текст для використовуваного git clean варіанти:

-d

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

-f

Якщо змінної конфігурації Git clean.requireForce не встановлено на false, Git clean відмовляється видаляти файли або каталоги, якщо не вказано -f, -n, або -i. Gіt відмовиться видаляти каталоги всередині .git підкаталог або файл, якщо не секунда -f дано

-x

Не використовуйте правила ігнорування .gitignore (за каталогом) і $GIT_DIR/info/exclude, але все одно використовуйте правила ігнорування, надані за допомогою -e варіанти Це дозволяє видалити всі не відстежені файли, в тому числі створювати продукти. Це може бути використано (можливо разом з git reset), щоб створити незайманий робочий каталог для перевірки чистої побудови.

Крім того, git checkout . треба робити в корені репо.


67
2018-04-28 19:46



+1 для цього рішення. Що стосується вашого зауваження, що "копіювання коментарів необхідно виконати в корені репо", можливо, ви можете згадати, що ми можемо просто зробити git reset --hardзамість цього? (що насправді еквівалентно git reset --hard HEAD і повинна працювати, залежно від того, чи є поточний каталог ...) - ErikMD
Також відносно першої команди git clean -dfx, ось порада, я використовую, щоб бути на безпечній стороні, перш ніж запустити її: просто бігати git clean -d -x -n перед тим, як відобразити список файлів, що підлягають видаленню, а потім підтвердити операцію запуском git clean -d -x -f (Я поставив аргумент -n, відповідно -f в кінці кінців, щоб швидко змінити його на терміналі) - ErikMD
Швидке примітка про те, що це незворотно, і якщо у вас є файли .gitignore ти їх програєш. Тому розгляньте резервну копію свого проекту до цього. - Rob