Что происходит с коммитами git, созданными в отключенном состоянии HEAD?

Вот что произошло:

У меня есть ветвь А. На ветке А я совершил кучу изменений. Я не был доволен кодом, поэтому я проверил предыдущий коммит в ветке А. Затем я внес еще несколько изменений и зафиксировал их в ветке А. Теперь я не могу найти этот коммит нигде. Я потерял этот код?

git
116 голосов | спросил Mausimo 3 AMpTue, 03 Apr 2012 01:38:04 +040038Tuesday 2012, 01:38:04

7 ответов


0

Старый коммит все еще находится в reflog.

git reflog

Это покажет список коммитов, и «потерянный» коммит должен быть там. Вы можете сделать это в новую ветку. Например, если SHA-1 - ba5a739, то вы можете создать новую ветку с именем «new-branch» при старой фиксации с помощью:

git branch new-branch ba5a739

Обратите внимание, что "потерянные" коммиты будут удалены при удалении базы данных.

ответил Dietrich Epp 3 AMpTue, 03 Apr 2012 01:40:48 +040040Tuesday 2012, 01:40:48
0

Ваши коммиты все еще доступны в reflog, как уже указывалось. В дополнение к другим ответам, вот способ перенести отключенные коммиты HEAD в вашу текущую ветку напрямую , без создания и объединения новой ветви:

  1. Посмотрите хэши SHA-1 коммитов, которые вы сделали в отдельном состоянии HEAD с помощью

    git reflog
    
  2. Затем выполните все упорядоченные хэши, упорядоченные от самых старых до самых последних:

    git cherry-pick <hash1> <hash2> <hash3> ...
    

    Например, если у меня был только один, указанный в формате коротких хэшей «первые 7 символов»:

    git cherry-pick a21d053
    

Это создаст новые коммиты в вашей текущей ветке, по одному коммиту на хэш detached-HEAD-commit, который вы упомянули в команде. Он также принимает исходные сообщения коммита.

ответил tanius 3 AMpWed, 03 Apr 2013 01:13:41 +040013Wednesday 2013, 01:13:41
0

Вы можете найти потерянные (висячие) коммиты с помощью следующей команды:

git fsck --lost-found

Обратите внимание, что если ваша текущая голова висячая коммит, она не будет указана как потерянная.

Вы можете найти больше информации на странице руководства git-fsck (1)

Затем вы можете создать ветку для этого потерянного коммита:

git branch new-branch ba5a739
ответил sergtk 17 J000000Thursday14 2014, 18:58:48
0

Git на языке вашего рабочего каталога - это « отдельная HEAD ». Вот еще одно место, где git reflog делает сохранение.

$ git reflog
0b40dd6 [email protected]{0}: commit: my commit on detached HEAD
...

Если я попытаюсь извлечь другую ветку, git-1.7.5.1 даст полезное предложение.

$ git checkout master
Предупреждение: вы оставляете 1 коммит, не подключенный к
любая из ваших веток:

  0b40dd6 мой коммит на отдельной голове

Если вы хотите сохранить их, создав новую ветку, это может быть хорошим временем
сделать это с:

 git branch new_branch_name 0b40dd65c06bb215327863c2ca10fdb4f904215b

Переключился на ветку 'master'
ответил Greg Bacon 3 AMpTue, 03 Apr 2012 01:43:04 +040043Tuesday 2012, 01:43:04
0

Вы не потеряли его, Git по-прежнему хранит копию (но в настоящее время она недоступна для любого руководителя филиала). Вы можете найти свой отсутствующий коммит, используя команду git reflog. Reflog отслеживает исторические позиции заголовка ветви, и вы можете использовать его, чтобы найти то, на что ранее указывал заголовок ветви.

ответил Greg Hewgill 3 AMpTue, 03 Apr 2012 01:40:20 +040040Tuesday 2012, 01:40:20
0

Выполните следующие действия, чтобы связать свою отстраненную голову с git repo

    git checkout "your branch with path but without remote name" литий>

например. если удаленное имя является источником, а имя ветви - bugfix/somebranch, тогда используйте git checkout bugfix/somebranch

    git reflog получить список SHA для фиксации из списка коммитов отдельной ветви. git cherry-pick "commit hash1" "commit hash2" "commit hash3" git push

ВСЕ УСТАНОВЛЕНЫ !!

ответил user1520615 23 32016vEurope/Moscow11bEurope/MoscowWed, 23 Nov 2016 13:32:05 +0300 2016, 13:32:05
0

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

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

Возьмите этот идентификатор фиксации для следующего шага.

Нажмите кнопку «Ветвь» на верхней панели инструментов, и вы получите диалоговое окно «Новая ветвь», в котором вы можете указать определенный коммит. Поместите этот коммит ID туда, укажите новое имя ветки, нажмите Create Branch, и вы должны получить новую ветку с вашим потерянным коммитом!

Это вернуло мне потерянную работу!

ответил blalond 11 J000000Friday14 2014, 18:57:38

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132