Вот что произошло:
У меня есть ветвь 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 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'
Ответ 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
-
git reflog
получить фиксацию SHA из списка фиксации отдельной ветки.
-
git cherry-pick "commit hash1" "commit hash2" "commit hash3"
-
git push
ВСЕ SET!!