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

Это то, что произошло:

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

7 ответов

Решение

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

git reflog

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

git branch new-branch ba5a739

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

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

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

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

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

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

    git cherry-pick a21d053
    

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

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

git fsck --lost-found

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

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

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

git branch new-branch ba5a739

Git, говоря о состоянии вашего рабочего каталога, - это " отдельная ГОЛОВА". Вот еще одно место, где git reflog делает спасение

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

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

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

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

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

 git branch new_branch_name 0b40dd65c06bb215327863c2ca10fdb4f904215b

Перешел на ветку "мастер" 

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

Выполните следующие шаги, чтобы связать свою отстраненную голову обратно в 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

ВСЕ ГОТОВО!!

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

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

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

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

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

Другие вопросы по тегам