GIT відновити останню від'єднану HEAD


85

Будь ласка, у мене є велика проблема в моєму проекті: це сценарій. У мене є проект xcode під GIT. Сьогодні я зрозумів, що останній коміт пробив деякі тести, тому перевірив попередній коміт. Я використовував SourceTree, і це попередження

Це зробить вашу робочу копію "відокремленою ГОЛОВОЮ", що означає, що ви більше не будете знаходитись на гілці. Якщо ви хочете зробити коміт після цього, ви, мабуть, захочете або перевірити гілку ще раз, або створити нову гілку. Чи це добре?

Я працював цілий день, а в кінці все зробив. Тож мені потрібно було об’єднати свою роботу над розвитком гілки, тому я перевірив гілку розробки і ... моя робота миттєво зникла :(

Я знаю, що неправильно було від'єднати ГОЛОВУ, і Sourcetree попередив мене ... але є спосіб відновити мою роботу?


Пов’язана тема для тієї самої проблеми тут та технічних характеристик того, як це відбувається тут .
RBT

Відповіді:


254

Якщо ви введете текст git reflog, він покаже вам історію того, на що HEADвказували зміни . Ваша відокремлена голова повинна бути там. Як тільки ви знайдете його, виконайте git checkout -b my-new-branch abc123або git branch my-new-branch abc123(де abc123знаходиться SHA-1 від'єднаної ГОЛОВИ), щоб створити нову гілку, яка вказує на вашу відокремлену голову. Тепер ви можете об’єднати цю гілку на дозвіллі.

Як правило, якщо ви перевіряєте гілку після роботи з від'єднаною головою, Git повинен повідомити вам про фіксацію з від'єднаної голови, на якій ви були, щоб ви могли відновити її, якщо вам потрібно. Я ніколи не використовував SourceTree, тому не знаю, чи передає це повідомлення. Але якщо воно відображало це повідомлення, то ви могли б використовувати це, щоб знайти коміт, і знову використати git checkout -bабо git branchстворити гілку з цього коміту.


4
Дякую Брайане. Ти врятував мій день.
Музамміл

Брайане, ти врятував моє життя! Дякую!!
cldrr

Я новачок у git .. я отримую fatal: A branch named 'mybranch' already exists.Як додати в існуючу гілку?
Рамеш Муругесан

1
Як PSA для всіх, хто дякує Брайану: Якщо ви виконуєте роботу, яку не хочете втрачати, кожні кілька годин штовхайте її на пульт (наприклад, github). Коли на ваш комп’ютер впаде метеор, ви будете раді, що зробили. Якщо ви ще не готові поділитися ним із співавторами, просто помістіть його у гілку, про яку поки ніхто не знає, а потім перебазуйте на master.
MatrixManAtYrService

1
Крім того, якщо це єдиний втрачений коміт, який щойно зник, і ви знайшли його там, ви можете повернути його назад git cherry-pick e5b2f7b, де e5b2f7bзнаходиться SHA-1 коміту.
Aidin

10

У Sourcetree ви можете зробити це за допомогою графічного інтерфейсу.

Спочатку знайдіть "загублений" коміт, шукаючи повідомлення в історії команд (вигляд: Показати вихід команди). Ймовірно, це буде в команді "Переключення гілки" після коміту, який ви втратили. Сподіваємось, у цьому повідомленні ви побачите коментар коміту з ідентифікатором коміту 1234567.

Перейдіть до цього ідентифікатора коміту до наступного кроку.

Натисніть кнопку "Відділення" на верхній панелі інструментів, і ви отримаєте діалогове вікно "Нова гілка", де ви можете вказати певний коміт. Помістіть туди цей ідентифікатор коміту, вкажіть нову назву гілки, натисніть Створити гілку, і ви повинні отримати нову гілку з втраченим комітом!

введіть тут опис зображення


насправді працює. Переконайтеся, що ви бачите правильний коментар з ідентифікатором коміту.
Хаммад-хан

@blalond Привіт, прочитавши вашу відповідь, у мене є невелике запитання: Коли в SourceTree я двічі клацну на попередній коміт (щоб перевірити його), я отримую те саме повідомлення, що це призведе до відшарування голови, тому мені цікаво що це означає, коли люди кажуть, що ви можете просто повернутися до будь-якої попередньої версії за допомогою git? Як тоді повернутися до певного коміту? Дякую

5

Якщо ви не хочете зберігати зміни від'єднаної HEAD і хочете перейти до останнього фіксації гілки, використовуйте команду нижче.

git checkout - 

Примітка: Я видалю всі ваші зміни у від'єднаній ГОЛОВІ.


ОП просив зберегти їх роботу. Це не відповідає на вихідне запитання. Просто додавши опцію зберігати це у гілці, ця відповідь стане корисною.
manuelvigarcia

1

У мого колеги якраз була така ситуація. У його випадку були коміти в окремій голові - вони працюють у R-Studio - і інструмент попередив їх про те, що вони можуть створити гілку за допомогою цього та цього посилання на SHA ... але оскільки єдиним варіантом було "Закрити" --дух !! це було інформаційне вікно - вони закрили діалог і втратили інформацію назавжди ...

Завдяки reflogкоманді ми могли побачити, що зміни не були втрачені. Але в нашому випадку git branchце не спрацювало, як очікувалося ..., або вхідний git pullце якось зіпсувало. Нам довелося переглядати зміни від рефлог до новоствореної гілки:

 git cherry-pick 0b823d42..3cce27fc

який розміщував усі необхідні комітети у відділенні. Тоді ми могли б об'єднати гілку developбез проблем.

На всякий випадок, якщо це комусь інформативно, ми ідентифікували коміти на відірваній голові в reflog, переглядаючи тих, хто знаходиться між позначеним "checkout" (що визначає зміщення філії):

e09f183b HEAD@{3}: pull: Fast-forward
b5bf3e1d HEAD@{4}: checkout: moving from lost_changes to develop
b5bf3e1d HEAD@{5}: checkout: moving from 3cce27fca50177a288df0252f02edd5da5ee64fd to lost_changes
3cce27fc HEAD@{6}: commit: add statistics
417a99a4 HEAD@{7}: commit: add test
0b823d42 HEAD@{8}: commit: new utility class
d9ea8a63 HEAD@{9}: checkout: moving from develop to d9ea8a635d4c2349fcb05b3339a6d7fad5ae2a09
b5bf3e1d HEAD@{10}: pull: Fast-forward

Ті , кого ми хотіли були HEAD@{8}в HEAD@{6}(обидва включно). Отже, ми отримали їх за допомогою:

git cherry-pick 0b823d42..3cce27fc

Тоді звичайне вирішення злиття та остаточний коміт залишили у нас гілку lost_changes, що розміщує роботу з відокремленою головою, яку ми вважали втраченою. Цього разу об’єднання цього в розробку було швидким.


0

Я спробував цей сценарій і виявив, що git повідомляє мені SHA-1 останнього коміту:

vors@localhost:~/git-test$ git checkout master 
Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  ec600e6 333

If you want to keep them by creating a new branch, this may be a good time
to do so with:

 git branch new_branch_name ec600e6eb2473dd4f3732539c5c1fa5829f631b7

Switched to branch 'master'

Ви бачили це повідомлення?


немає. або, можливо, я не звертаю уваги. Я шукаю резервну копію на timemachine; (
IgnazioC

1
@IgnazioC Вам не потрібно шукати резервну копію. Ви зазирнули до моєї відповіді? git reflogповинен показати вам, що вам потрібно.
Брайан Кемпбелл

0

відірвана голова чудова, якщо ви хочете внести жодних змін.

Якщо ви хочете скасувати коміт, ви можете використовувати git revert для певної гілки

Якщо ви хочете відпрацювати відірвану голову і зробити коміти; створити нову гілку (а згодом об’єднати її);


Ага! ми знаємо правила. Але коли колеги відпрацьовують відірвану голову, а потім залишають ці зобов'язання, вони просять відповіді, а не правил.
manuelvigarcia

0
  1. Спочатку біжіть, git reflogщоб переглянути історію.
  2. Найдавніша редакція буде останньою у списку.
  3. Перейдіть до бажаного git checkout -b temp e35d2b3коміту, використовуючи тут e35dd23 - хеш-значення вашого коміту.
  4. Це воно. Тепер просто зробіть git add. тощо ....

Прийміть це як відповідь, якщо це вирішить вашу проблему. В іншому випадку, будь ласка, поділіться своїм коментарем.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.