10

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

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

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

3 ответа3

24

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

$ cd submodule_dir
$ git reflog          # Find the commit
$ git checkout master
$ git cherry-pick $SHA_OF_MISSING_CMMIT
3

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

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

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

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

git checkout branchname
git merge HEAD@{1}

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

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

1

Чтобы добавить к предыдущим ответам:

Пока вы все еще на отдельном HEAD, вы можете добавить тег:

git tag <some-tag>

Это добавит тег к коммиту, который сделает его видимым в gitk и других инструментах.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .