Подтвердить что ты не робот

GIT восстановить последнюю удаленную головку

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

Это сделает вашу рабочую копию "отделенной ГОЛОВКОЙ", что означает, что вы больше не будете на ветке. если вы хотите зафиксировать после этого, вы, вероятно, захотите либо снова оформить ветку, либо создать новую ветку. Это нормально?

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

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

большое спасибо.

4b9b3361

Ответ 1

Если вы наберете git reflog, он покажет вам историю того, на что указывают ревизии HEAD. Ваша отдельная голова должна быть там. Найдя его, сделайте git checkout -b my-new-branch abc123 или git branch my-new-branch abc123 (где abc123 - SHA-1 отдельно взятой HEAD), чтобы создать новую ветвь, указывающую на вашу отдельную голову. Теперь вы можете объединить эту ветку на досуге.

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

Ответ 2

В Sourcetree вы можете сделать это с помощью графического интерфейса.

Сначала найдите "потерянный" коммит, посмотрев сообщение в истории команд (см.: Показать вывод команды). Вероятно, это будет в команде "Switching Branch" после коммита, который вы потеряли. Надеемся, что в этом сообщении вы увидите комментарий о коммите с идентификатором коммита 1234567.

Перенесите этот идентификатор фиксации на следующий шаг.

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

enter image description here

Ответ 3

Если вы не хотите сохранять изменения отсоединенной HEAD и хотите перейти к последней ветке commit, используйте ниже команду напрямую.

git checkout - 

Примечание. Я удалю все ваши изменения в отдельной HEAD.

Ответ 4

У моего коллеги только что была такая ситуация. В его случае в R-Studio были зафиксированы коммиты в работе с отделенной головкой --they, и инструмент предупредил их, что они могут создать ветвь с этим и этой ссылкой SHA... но так как единственной опцией было "Закрыть" --duh !! это была информация box--, они закрыли диалог и потеряли информацию навсегда...

Благодаря команде reflog мы увидели, что изменения не были потеряны. Но в нашем случае git branch не сработал так, как ожидалось... или входящий git pull все испортил. Нам пришлось ловить изменения из reflog во вновь созданную ветку:

 git cherry-pick 0b823d42..3cce27fc

который разместил все коммиты, которые мы хотели, в ветке. тогда мы сможем объединить ветку в develop без проблем.

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

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

Мы хотели от [email protected]{8} до [email protected]{6} (оба включительно). Итак, мы получили их:

git cherry-pick 0b823d42..3cce27fc

Затем обычное решение слияния и окончательная фиксация оставили нас с веткой lost_changes, где размещалась работа с отстраненной головой, которую мы считали потерянной. На этот раз слияние в развитие было быстрым шагом вперед.

Ответ 5

Я пробовал этот сценарий и обнаружил, что git сказать мне SHA-1 последнего коммита:

[email protected]:~/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'

Вы видели это сообщение?

Ответ 6

отсоединенная головка прекрасна до тех пор, пока вы не хотите делать никаких изменений.

Если вы хотите вернуть фиксацию, вы можете использовать git revert на определенной ветке

Если вы хотите поработать с отсоединенной головой и выполнить ее; создайте новую ветвь (и затем слейте ее);

Ответ 7

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

Примите это как ответ, если это решит вашу проблему. В противном случае, пожалуйста, поделитесь своим комментарием.