Відновлення та підстраховка

Відновлення та рефлог

Git рідко щось втрачає. Складніше — знайти це знову.

Рефлог

Кожен рух HEAD — і кожної гілки — з причиною, яка його спричинила: чекаут, скидання, ребейз, amend, примусовий фетч. З будь-якого минулого запису можна зробити чекаут, створити з нього гілку або зробити hard reset на нього.

Переглядач рефлогу

Це та сама кнопка «я щойно скинув не ту гілку».

WIP-знімки

Незакомічена робота — єдине, чого рефлог врятувати не може, тож Gitcito робить її знімки: все робоче дерево — змінені, проіндексовані та невідстежувані файли — закомічені через одноразовий індекс і закріплені під refs/gitcito/wip. Ані ваш справжній індекс, ані список стешів не зачіпаються.

WIP-знімки

Знімок роблять три речі:

Тригер Коли
Вартовий Автоматично, просто перед руйнівною дією — відкиданням змін, очищенням, hard reset, відновленням із коміта. Типово ввімкнений; перемикається в діалозі знімків.
Таймер Кожні 5 / 15 / 30 хвилин, поки репозиторій відкритий.
Вручну Кнопка Зробити знімок зараз.

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

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

Обмеження, які варто знати. Спрацювання таймера чи вартового, що не знаходить нічого нового, нічого не записує. Відновлення перезаписує та відтворює файли, але ніколи не видаляє файл, створений після знімка. Ігноровані файли не захоплюються. Знімки — локальні приховані рефи: ніколи не пушаться, у безпеці від git gc, зберігається 50 найновіших.

Бісект із супроводом

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

Бісект із супроводом

Хай вирішує команда

Щойно діапазон задано, Хай вирішує команда передає весь пошук у git bisect run. Git робить чекаут кожного кандидата, запускає вашу команду і читає її код виходу:

Код виходу Означає
0 Добре — тут бага немає
125 Цей перевірити неможливо; пропустити його
будь-що інше Погано

Тестовий набір уже говорить цією мовою, і саме тому npm test зазвичай і є повною відповіддю. Gitcito пропонує власні скрипти цього проєкту як заповнення в один клік, стримить вивід під час виконання і приземляється на першому поганому коміті, а ви не відповідаєте на жодне запитання.

Поле команди, готове передати пошук тестовому набору

За чим стежити. Команда виконується на кожному коміті, який перевіряє git, тож команда, яка розгортає, публікує чи пише за межі репозиторію, зробить це кілька разів поспіль. Тримайтеся чогось, що лише читає й звітує. Зупинити вбиває виконання й лишає сесію відкритою, тож ви можете далі позначати вручну; Перервати завершує бісект узагалі.

Команда, яка падає з непов’язаної причини — скажімо, через відсутню залежність у тій точці історії — позначить хороший коміт поганим і відправить пошук не туди. Вихід із кодом 125 зі скрипта-обгортки — це спосіб git з цього виплутатися.

Забутий файл блокування

Git створює файл .lock поруч із тим, що збирається записати, і прибирає його, коли запис завершився. Процес, що загинув із блокуванням у руках — редактор, який упав, термінал, закритий під час git commit, fetch, убитий під час чищення віддалених посилань, — лишає його, і відтоді будь-який запис падає з тим самим рядком:

error: could not delete references: cannot lock ref 'refs/remotes/origin/x':
Unable to create '…/refs/remotes/origin/x.lock': File exists.

Репозиторій не пошкоджено. Просто на шляху лежить файл.

Спершу Gitcito повторює спробу кілька разів: блокування в руках робочого git зазвичай звільняється за мілісекунди. Якщо ні — помилка відкриває діалог замість стіни тексту: усі блокування, що ще лежать на диску, вік кожного та одна кнопка, яка вилучає їх і повторює дію, що не вдалася.

Вік — увесь аргумент. Блокування, молодше за 30 секунд, вважається таким, що належить git, який ще працює, і Gitcito відмовляється його вилучати — натомість пропонує зачекати й повторити. Старіші пропонуються до вилучення, від найстарішого, а діалог прямо каже, що перевірити перед згодою: що зараз у цьому репозиторії не працює ані редактор, ані термінал, ані інший Git-клієнт. Забрати блокування з-під живого запису — певний спосіб порвати індекс.

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

Скасувати / повторити

Більшість операцій кладуть запис у стек скасувань, тож ⌘Z відкочує останню з них там, де git це дозволяє.

Дивіться також: Що змінилося відтоді · Стеші

Покращити цей переклад на GitHub