Git - Як повернути всі локальні зміни в керованому проекті Git у попередній стан

У мене є проект, в якому я запускав git init. Після кількох коммітів я зробив git status, який сказав мені, що все було в курсі подій, і локальних змін не було.

Потім я зробив кілька послідовних змін і зрозумів, що хочу викинути все і повернутися до свого початкового стану. Чи робитиме ця команда це для мене?

Якщо ви хочете скасувати зміни, внесені до робочої копії, зробіть таке:

Якщо ви хочете скасувати зміни, внесені до індексу (тобто ви додали), зробіть це.Попередження: reset всі ваші невстановлені коміти для освоєння! :

Якщо ви хочете повернути внесену зміну, зробіть таке:

Якщо ви хочете видалити файли, що не використовуються (наприклад, нові файли, згенеровані файли):

Або каталоги, що не відстежуються (наприклад, нові або автоматично створені каталоги):

Примітка. Ви також можете запустити

не видаляє непотрібні файли, де git -clean видалить будь-які файли з кореневого каталогу, що відстежується, які не знаходяться під git відстеженням. ПОПЕРЕДЖЕННЯ - ОБЕРЕЖНО! Корисно запускати сухий пробіг за допомогою git-clean спочатку, щоб побачити, що він видалятиме.

Це також особливо корисно, коли ви отримуєте повідомлення про помилку

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

У цій ситуації виконання сухого запуску також допоможе відобразити список файлів, які будуть перезаписані.

Подивіться на git-reflog. Вінперерахує всі стани, що він пам'ятає (за замовчуванням 30 днів), і ви можете просто перевірити той, який ви хочете. Наприклад:

Якщо ви хочете повернути всі зміни і оновитися з поточним віддаленим майстром (наприклад, ви виявите, що ведучий HEAD просунувся вперед, тому що ви відокремили його, а ваш push "відхилений"), ви можете використовувати

Прочитавши купу відповідей і спробувавши їх, я виявив різні крайові випадки, які іноді означають, що вони повністю очищають робочу копію.

Тут мій поточний bash script для це, котрий працює весь час.

Запуск із кореневого каталогу робочої копії.

повністю видалити всі файли, включаючи каталоги, які я повинен був запустити

Я мала аналогічну проблему. Рішення полягає у використанні git log для пошуку, яка версія локального комміту відрізняється від віддаленого. (Наприклад, версія 3c74a11530697214cbcc4b7b98bf7a65952a34ec).

Потім скористайтеся git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec , щоб повернути зміну.

він видалить усі ваші локальні дії. і ви також можете використовувати пізніше, кажучи

  • ✅ Видаляє локальні, не натиснені коміти
  • ✅ Скасує зміни, які Ви внесли у відстежувані файли.
  • ✅ Відновлює видалені видалені файли.
  • ✅ Видаляє файли/каталоги, перелічені в .gitignore (наприклад, файли збирання)
  • ✅ Видаляє файли/директорії, які не відстежуються, а не в .gitignore
  • 😀 Ви не забудете про цей підхід
  • 😔 Відходи пропускної спроможності

Нижче наведено інші команди, які я забуваю щодня.

Очистити та reset

  • ❌ НЕ видаляє локальні, не натиснені коміти
  • ✅ Скасує зміни, які Ви внесли у відстежуваніфайли.
  • ✅ Відновлює видалені видалені файли.
  • ✅ Видаляє файли/каталоги, перелічені в .gitignore (наприклад, файли збирання)
  • ✅ Видаляє файли/директорії, які не відстежуються, а не в .gitignore
  • ❌ НЕ видаляє локальні, не натиснені коміти
  • ❌ НЕ скасовує внесені зміни до файлів, що відстежуються.
  • ❌ НЕ відновлює видалені видалені файли.
  • ✅ Видаляє файли/каталоги, перелічені в .gitignore (наприклад, файли збирання)
  • ✅ Видаляє файли/директорії, які не відстежуються, а не в .gitignore
  • ❌ НЕ видаляє локальні, не натиснені коміти
  • ✅ Скасує зміни, які Ви внесли у відстежувані файли.
  • ✅ Відновлює видалені видалені файли.
  • ❌ Видаляє файли/каталоги, перелічені в .gitignore (наприклад, файли збирання)
  • ❌ НЕ видаляє файли/директорії, які не відстежуються, а не в .gitignore

Примітки

Тестовий приклад для підтвердження всього вищевикладеного (використовуйте bash або sh):

Див. також

  • git revert , щоб зробити нові коміти, які скасують попередні коміти
  • git checkout , щоб повернутися вчасно до попередніх коммітів (може знадобитися спочатку виконати команди вище)
  • git stash так само, як git reset вище, але ви можете скасувати його

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

Деякими поширеними випадками використання для цього було б видалити cruft , який був згенерований злиттями або зовнішніми інструментами або видалити інші файли, щоб ви могли запускати чисту збірку.

Котрийвидалить все, окрім як зберегти все у гаманці. Потім цю схованку може бути використаний.

Однак, якщо ви дійсно хочете видалити всі файли та очистити робочий каталог, ви повинні виконати

Це призведе до видалення будь-яких файлів, а також будь-яких підкаталогів, які не мають елементів у результаті виконання команди. Перед виконанням команди git clean -f -d слід виконати розумне завдання:

Отже, ось зведення ваших варіантів від найагресивніших до найменш агресивних

Варіант 1 : видалити всі файли локально (найбільш агресивно)

Варіант 3 : сховай усі файли (найменш агресивні)