Спочатку давайте уточнимо, що таке HEAD і що це означає, коли воно від'єднується.
HEAD - символічна назва для поточно перевірених комірок. Якщо HEAD не відокремлений ("нормальна" 1 ситуація: у вас є філія перевірена), HEAD насправді вказує на "ref" гілки, а гілка вказує на фіксацію. Таким чином, HEAD "прикріплений" до гілки. Коли ви робите нове зобов’язання, гілка, на яку вказує HEAD, оновлюється, щоб вказувати на нову комісію. HEAD слід автоматично, оскільки він просто вказує на гілку.
git symbolic-ref HEAD
врожайність refs/heads/master
Відділення з назвою «майстер» перевірено.
git rev-parse refs/heads/master
урожай, 17a02998078923f2d62811326d130de991d1a95a
який виконує, є поточним наконечником або "головою" головного відділення.
git rev-parse HEAD
також дає результат. 17a02998078923f2d62811326d130de991d1a95a
Це те, що означає бути "символічною рефлексією". Він вказує на об’єкт через якусь іншу посилання.
(Спочатку символічні рефлекси спочатку реалізовувалися як символьні посилання, але згодом були змінені на звичайні файли з додатковою інтерпретацією, щоб їх можна було використовувати на платформах, що не мають посилань.)
У нас є HEAD
→ refs/heads/master
→17a02998078923f2d62811326d130de991d1a95a
Коли HEAD відокремлюється, він вказує безпосередньо на фіксування, а не опосередковано вказує на один через гілку. Ви можете подумати про відокремлену ГОЛОВУ як про неназвану гілку.
git symbolic-ref HEAD
не вдається з fatal: ref HEAD is not a symbolic ref
git rev-parse HEAD
урожаї 17a02998078923f2d62811326d130de991d1a95a
Оскільки це не символічний перелік, він повинен вказувати безпосередньо на себе.
У нас HEAD
→17a02998078923f2d62811326d130de991d1a95a
Важливо пам’ятати з відокремленою ГОЛОВОЮ, що якщо комісія, на яку вона вказує, інакше не буде відновлена (жодна інша відповідь не може її досягти), вона стане «звисаючою», коли ви перевірите якусь іншу комісію. Врешті-решт, такі звисаючі домовленості будуть обрізані через процес вивезення сміття (за замовчуванням вони зберігаються щонайменше 2 тижні і можуть зберігатися довше, якщо на них посилається рефлог HEAD).
1
Цілком чудово виконувати «звичайну» роботу з відокремленою ГОЛОВОЮ, вам просто потрібно слідкувати за тим, що ви робите, щоб уникнути необхідності виловлювати історію з рефлогу.
Проміжні етапи інтерактивної бази даних виконуються з відокремленою HEAD (частково, щоб уникнути забруднення рефлогу активної гілки). Якщо ви закінчите повну операцію ребаші, вона оновить вашу початкову гілку з сукупним результатом операції ребасті та повторно приєднає HEAD до початкової гілки. Я здогадуюсь, що ви ніколи повністю не завершили процес відновлення; це дозволить залишити вас відокремленою HEAD, яка вказує на комітет, який останнім часом був оброблений операцією ребайна.
Щоб відновитись із своєї ситуації, вам слід створити гілку, яка вказує на зобов’язання, на яке зараз вказує ваш відокремлений HEAD:
git branch temp
git checkout temp
(ці дві команди можна скоротити як git checkout -b temp
)
Це приєднає вашу голову до нової temp
гілки.
Далі слід порівняти поточну комісію (та її історію) із звичайною гілкою, над якою ви очікували працювати:
git log --graph --decorate --pretty=oneline --abbrev-commit master origin/master temp
git diff master temp
git diff origin/master temp
(Ви, ймовірно, захочете поекспериментувати з параметрами журналу: додайте -p
, залиште, --pretty=…
щоб переглянути все повідомлення журналу тощо)
Якщо ваша нова temp
гілка виглядає добре, ви можете оновити (наприклад), master
щоб вказати на неї:
git branch -f master temp
git checkout master
(ці дві команди можна скоротити як git checkout -B master temp
)
Потім можна видалити тимчасову гілку:
git branch -d temp
Нарешті, ви, ймовірно, захочете просунути відновлену історію:
git push origin master
Вам може знадобитися додати --force
до кінця цієї команди, щоб натиснути, якщо віддалену гілку неможливо "перемотати" до нової комісії (тобто ви скинули або переписали якусь діючу комісію або іншим чином переписали деякий біт історії).
Якщо ви були в середині операції з ребайнами, ви, ймовірно, повинні її очистити. Ви можете перевірити, чи працювала база даних, шукаючи каталог .git/rebase-merge/
. Ви можете вручну очистити незавершене базу даних, просто видаливши цей каталог (наприклад, якщо ви більше не пам’ятаєте мету та контекст активної операції ребасті). Зазвичай ви користуєтесь цим git rebase --abort
, але це робить додаткове скидання, якого ви, мабуть, хочете уникнути (він переміщує HEAD назад до початкової гілки та скидає його назад до оригінальної фіксації, що скасує частину роботи, яку ми зробили вище).