Что происходит с git совершается в отдельном состоянии HEAD?

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

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

Ответ 1

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

git reflog

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

git branch new-branch ba5a739

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

Ответ 2

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

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

    git reflog
    
  • Затем выполните, со всеми хэшами фиксации, от старых до самых последних:

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

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

    git cherry-pick a21d053
    

Это создаст новую фиксацию для вашей текущей ветки (по одному для отдельного-HEAD-commit, которое вы укажете в команде). Он также берет на себя оригинальные сообщения фиксации.

Ответ 3

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

git fsck --lost-found

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

Дополнительную информацию можно найти на git -fsck (1) Страница руководства

Затем вы можете создать ветвь на потерянной фиксации:

git branch new-branch ba5a739

Ответ 4

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

Ответ 5

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

$ git reflog
0b40dd6 [email protected]{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'

Ответ 6

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

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

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

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

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

Ответ 7

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

  • 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

ВСЕ SET!!