Что происходит с коммитами git, созданными в отключенном состоянии HEAD? - PullRequest
122 голосов
/ 03 апреля 2012

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

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

Ответы [ 7 ]

164 голосов
/ 03 апреля 2012

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

git reflog

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

git branch new-branch ba5a739

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

51 голосов
/ 03 апреля 2013

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

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

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

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

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

    git cherry-pick a21d053
    

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

10 голосов
/ 17 июля 2014

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

git fsck --lost-found

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

Вы можетеБолее подробную информацию можно найти на git-fsck (1). Страница руководства

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

git branch new-branch ba5a739
6 голосов
/ 03 апреля 2012

Git на языке вашего рабочего каталога - это & ​​ldquo; detached HEAD . & Rdquo; Вот еще одно место, где git reflog спасает.

$ git reflog
0b40dd6 HEAD@{0}: commit: my commit on detached HEAD
...

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

$ git checkout master
Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  0b40dd6 my commit on detached HEAD

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 0b40dd65c06bb215327863c2ca10fdb4f904215b

Switched to branch 'master'
5 голосов
/ 03 апреля 2012

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

3 голосов
/ 23 ноября 2016

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

  1. git checkout "your branch with path but without remote name"

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

  1. git reflog получите список SHA для фиксации из списка коммитов отдельной ветви.

  2. git cherry-pick "commit hash1" "commit hash2" "commit hash3"

  3. git push

ВСЕ КОМПЛЕКТ !!

1 голос
/ 11 июля 2014

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...