Пошук уроків, статей та іншого контенту
Навчитеся працювати в режимі detached HEAD і безпечно зберігати потрібні коміти в новій гілці.
Зазвичай HEAD вказує на поточну гілку, а гілка — на останній коміт:
HEAD → main → комітУ режимі detached HEAD HEAD вказує безпосередньо на коміт, а не на гілку:
HEAD → комітЦе трапляється, коли ви переходите безпосередньо на:
хеш коміту;
тег;
інший спеціальний стан репозиторію.
Такий режим зручний, коли потрібно:
переглянути стару версію проєкту;
перевірити, як працював код у конкретному коміті;
тимчасово внести зміни та перевірити ідею;
порівняти різні версії без переходу на робочу гілку.
detached HEAD не є помилкою. Git лише попереджає, що нові коміти не належатимуть жодній звичайній гілці, доки ви явно не створите її.
Щоб перейти на конкретний коміт, використовуйте:
git switch --detach <commit>Наприклад:
git switch --detach a1b2c3dХеш можна взяти з історії:
git log --onelineПриклад виводу:
a1b2c3d Додано перевірку форми
7e8f9a0 Створено сторінку входуТепер можна перейти на коміт 7e8f9a0:
git switch --detach 7e8f9a0Git повідомить, що ви перебуваєте в detached HEAD:
You are in 'detached HEAD' state.Перевірити поточний стан можна командою:
git statusУ результаті буде приблизно таке повідомлення:
HEAD detached at 7e8f9a0
nothing to commit, working tree cleanТакож корисно переглянути поточний коміт:
git log -1 --onelineПісля переходу на коміт файли в робочій директорії відповідають саме цій версії.
Наприклад:
git switch --detach 7e8f9a0Після цього можна:
відкрити файли;
запустити програму;
виконати тести;
переглянути історію;
порівняти код із поточною версією.
Поки ви не створюєте нових комітів, історія репозиторію не змінюється.
Щоб повернутися до гілки, виконайте:
git switch mainНазва гілки може бути іншою, наприклад:
git switch developУ detached HEAD можна змінювати файли так само, як у звичайній гілці.
Перевіримо стан після зміни файлу:
git statusGit покаже змінені файли:
Changes not staged for commitТакі зміни є звичайними незбереженими змінами робочої директорії. Їх можна:
перевірити;
додати до індексу;
закомітити;
скасувати.
Наприклад:
git add .
git commit -m "Тимчасова перевірка старої версії"Коміт створиться, але спочатку не належатиме жодній гілці. Щоб не втратити до нього зручний доступ, одразу створіть нову гілку:
git switch -c experiment-old-versionТепер поточний коміт і всі наступні коміти належать гілці experiment-old-version.
Якщо ви перейшли на коміт і вирішили зберегти його як окрему основу для роботи, створіть гілку одразу:
git switch --detach <commit>
git switch -c saved-versionНова гілка починатиметься з вибраного коміту.
Наприклад:
git switch --detach 7e8f9a0
git switch -c investigate-loginПісля цього можна працювати звичайним способом:
# Змініть файли
git add .
git commit -m "Експеримент зі сторінкою входу"Перевірити гілки можна так:
git branchПоточна гілка буде позначена символом *:
* investigate-login
mainНижче наведено самодостатній приклад. Він створює репозиторій із двома комітами, переходить на перший коміт, вносить тимчасову зміну та зберігає її в новій гілці.
#!/usr/bin/env bash
set -e
# Створюємо демонстраційний репозиторій
rm -rf detached-head-demo
mkdir detached-head-demo
cd detached-head-demo
git init
git config user.name "Demo User"
git config user.email "demo@example.com"
# Створюємо першу версію файлу
printf "Версія 1\n" > notes.txt
git add notes.txt
git commit -m "Створено файл нотаток"
# Створюємо другу версію
printf "Версія 2\n" >> notes.txt
git add notes.txt
git commit -m "Додано другу версію"
# Показуємо історію
git log --oneline
# Переходимо на попередній коміт у режимі detached HEAD
git switch --detach HEAD~1
# Переглядаємо стан старої версії
cat notes.txt
git status
# Вносимо тимчасову зміну
printf "Експериментальна зміна\n" >> notes.txt
# Перевіряємо і зберігаємо зміну комітом
git add notes.txt
git commit -m "Експеримент у detached HEAD"
# Створюємо гілку, щоб зберегти цей коміт
git switch -c experiment-old-version
# Перевіряємо результат
git status
git log --oneline --decorate --allПісля виконання команди git switch -c experiment-old-version коміт із тимчасовою зміною буде надійно доступний через нову гілку.
Якщо зміни не потрібні, їх можна скасувати до створення коміту:
git restore notes.txtЩоб скасувати всі зміни у відстежуваних файлах:
git restore .Будьте уважні: git restore видаляє незбережені зміни у файлах. Після цього їх не можна буде відновити звичайними командами Git.
Якщо ви вже створили коміт у detached HEAD і він вам не потрібен, можна просто перейти на потрібну гілку:
git switch mainЯкщо коміт був створений без гілки, він більше не буде частиною поточної історії. Тому для важливих змін краще створювати гілку:
git switch -c saved-workПеред виходом із detached HEAD перевірте:
git status
git log -1 --onelineЯкщо є незбережені зміни, потрібно вибрати один із варіантів:
Закомітити зміни та створити гілку:
git add .
git commit -m "Зберегти експеримент"
git switch -c saved-workСтворити гілку до комітування, а потім зробити коміт:
git switch -c saved-work
git add .
git commit -m "Зберегти експеримент"Скасувати зміни, якщо вони більше не потрібні:
git restore .Найбезпечніший варіант для роботи, яку ви хочете зберегти, — створити гілку перед подальшими змінами.
git switch main із незбереженими змінамиЯкщо локальні зміни конфліктують із файлами в гілці main, Git може відмовитися виконувати перехід:
Your local changes to the following files would be overwrittenСпочатку потрібно або закомітити зміни:
git add .
git commit -m "Зберегти зміни"або скасувати їх:
git restore .Коміти в detached HEAD створюються, але не належать гілці. Якщо перейти на іншу гілку, такий коміт буде складніше знайти.
Якщо коміт потрібен, створіть гілку:
git switch -c saved-workКоманда:
git switch mainперемикає на гілку.
Команда:
git switch --detach <commit>перемикає безпосередньо на коміт і вмикає detached HEAD.
Повідомлення про detached HEAD — це попередження, а не помилка. Воно нагадує, що нові коміти потрібно прив’язати до гілки, якщо ви хочете зберегти їх у звичному вигляді.
detached HEAD означає, що HEAD вказує безпосередньо на коміт, а не на гілку.
Для перегляду конкретного коміту використовуйте git switch --detach <commit>.
У цьому режимі можна переглядати код, запускати тести та вносити тимчасові зміни.
Тимчасові зміни можна закомітувати навіть у detached HEAD.
Щоб зберегти потрібний коміт, створіть нову гілку командою git switch -c <назва-гілки>.
Перед переходом на іншу гілку перевірте незбережені зміни командою git status.