Спасение файлов и коммитов из "no ветки" в git

7980
Xeoncross

Я начал работать с некоторыми файлами в подмодуле git другого проекта. Однако, поскольку это был подмодуль git, он никогда не проверял «master», а вместо этого просто проверял заголовок и помещал все файлы в папке в «no ветку».

Теперь, когда я случайно сделал некоторые изменения в этих файлах, я просто понял, что работаю в подмодуле моего проекта «без ветки».

Как мне поместить эти файлы в ветку (например, master), чтобы я мог их спасти?

10

3 ответа на вопрос

24
mipadi

Вы можете использовать, git reflogчтобы найти «потерянные» коммиты:

$ cd submodule_dir $ git reflog # Find the commit $ git checkout master $ git cherry-pick $SHA_OF_MISSING_CMMIT 
Да, это работало отлично! за исключением того, что я сделал `git merge $ COMMIT_SHA`, когда был в другой ветке. Xeoncross 14 лет назад 0
3
Chris Johnsen

Состояние «без ответвления» называется отделенной HEAD. Это называется так, потому что ссылка HEAD не привязана ни к какой ветви, вместо этого она указывает непосредственно на коммит. Чтобы присоединить HEAD к ветви, которая указывает на текущий коммит HEAD, используйте git checkout -b branchname.

Вы можете безопасно обновить существующую ветку, включив в нее коммиты в следующей последовательности:

git branch temp git checkout branchname git merge temp git branch -d temp 

Или, что то же самое, используя запись reflog, HEAD@чтобы избежать создания временной ветви:

git checkout branchname git merge HEAD@ 

Использование временной ветки было бы хорошей идеей, если вы не собираетесь выполнять слияние сразу.

Если вы хотите принудительно перезаписать существующую ветку, чтобы указать на фиксацию в HEAD, вы можете использовать git branch -f branchname && git checkout branchname. Если фиксация в HEAD не основана на текущем наконечнике branchname, это приведет к изменению без перемотки на branchname, которого вы обычно избегаете (это рассматривается как переписывание истории).

Обратите внимание, что в этом ответе предполагается, что HEAD все еще указывает на последний коммит, который был не на ветке. Если вы переместили ГОЛОВУ с тех пор и только сейчас поняли, что произошло, вам, возможно, придется искать этот потерянный коммит в reflog (см. Ответ mipadi). LarsH 6 лет назад 0
1
data

To add to previous answers:

While you're still on a detached HEAD, you can add a tag:

git tag <some-tag> 

This will add a tag to the commit, which will make it visible in gitk and other tools.

Похожие вопросы