Рятування файлів і комітетів від "немає філії" в git


11

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

Тепер, коли я змінив ці файли випадково, я просто зрозумів, що працюю в підмодулі мого проекту.

Як отримати ці файли у гілку (наприклад, майстер), щоб я міг їх врятувати?

Відповіді:


28

Ви можете використовувати 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

3

Стан "немає гілки" називається відокремленою ГОЛОВОЮ. Це називається тому, що посилання HEAD не прикріплене до жодної гілки, натомість вказує безпосередньо на коміт. Щоб приєднати HEAD до гілки, яка вказує на поточну комісію HEAD, використовуйте git checkout -b branchname.

Ви можете безпечно оновити існуючу гілку, щоб включити комісії в HEAD з цією послідовністю:

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

Або, що рівно, використовуючи позначення рефлогу, HEAD@{1}щоб уникнути необхідності робити тимчасову гілку:

git checkout branchname
git merge HEAD@{1}

Використання тимчасової гілки було б гарною ідеєю, якщо ви не збиралися робити злиття негайно.

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


Зверніть увагу, що ця відповідь передбачає, що HEAD все ще вказує на останнє фіксацію, яке не було на гілці. Якщо ви перемістили HEAD з тих пір і тільки тепер зрозуміли, що сталося, можливо, вам доведеться шукати цю втрачену команду в рефлогу (див. Відповідь mipadi).
LarsH

1

Щоб додати до попередніх відповідей:

Поки ви все ще знаходитесь на відокремленій HEAD, ви можете додати тег:

git tag <some-tag>

Це додасть тег до коміту, який зробить його видимим у gitkта інших інструментах.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.