Что происходит с коммитами git, созданными в отключенном состоянии HEAD?
Это то, что произошло:
У меня есть ветка А. На ветке AI совершено кучу изменений. Я не был доволен кодом, поэтому я проверил предыдущий коммит в ветке А. Затем я внес еще несколько изменений и зафиксировал их в ветке А. Теперь я не могу найти этот коммит нигде. Я потерял этот код?
7 ответов
Старый коммит все еще находится в reflog.
git reflog
Это покажет список коммитов, и "потерянный" коммит должен быть там. Вы можете сделать это в новую ветку. Например, если SHA-1 - ba5a739, то вы можете создать новую ветку с именем "new-branch" при старой фиксации с помощью:
git branch new-branch ba5a739
Обратите внимание, что "потерянные" коммиты будут удалены при удалении базы данных.
Ваши коммиты все еще доступны в reflog, как уже отмечалось. В дополнение к другим ответам, вот способ перенести отключенные коммиты HEAD непосредственно в вашу текущую ветку, не создавая и не объединяя новую ветку:
Посмотрите хэши SHA-1 коммитов, которые вы сделали в отдельном состоянии HEAD
git reflog
Затем выполните все упорядоченные хэши от самых старых до самых последних:
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
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
ВСЕ ГОТОВО!!
В Sourcetree я обнаружил, что git reflog не работает, поэтому я выяснил, как это сделать с помощью графического интерфейса.
Сначала попробуйте найти "потерянный" коммит, отыскивая сообщение в истории команд (см.: Показать вывод команды). Надеемся, что он будет в команде "Switching Branch" после потерянного вами коммита, и вы увидите комментарий коммита с идентификатором коммита 1234567.
Возьмите этот идентификатор фиксации к следующему шагу.
Нажмите кнопку "Ветвь" на верхней панели инструментов, и вы получите диалоговое окно "Новая ветвь", в котором вы можете указать определенный коммит. Поместите этот коммит ID туда, укажите новое имя ветки, нажмите Create Branch, и вы должны получить новую ветку с вашим потерянным коммитом!
Это вернуло мне потерянную работу!