Переглядайте сирітські обряди в Git


102

Мій сховище git якось вийшов химерним - я завантажив msysgit сьогодні вранці, і замість того, щоб назва гілки відображалася після поточного каталогу, вона говорить "((ref: re ...))", "git status" повідомляє про все як новий файл, "git log" та "git reflog" скажіть мені "фатально: погана редакція за замовчуванням" HEAD "" тощо.

Здійснення "git reflog --all" або "gitk --all" показує мені, що решта сховища є недоторканою, але схоже, що гілка, над якою я працював, просто зникла, що пояснює, чому HEAD, здається, не існує / вказувати на що завгодно.

Я знаю, що git зберігає всілякі сфери інформації, і я припускаю, що мої зобов'язання якимось чином осиротіли, тож чи є якась команда, яка покаже мені ці зобов'язання, щоб я міг скинути HEAD на них?

РЕДАКТ: О дорогий. Я виявив "git fsck", а "git fsck --full" повідомляє "фатально: об'єкт 03ca4 ... пошкоджений". Що чорт я можу з цим зробити?

EDIT: О, дорогий о, дорогий. Я перевірив іншу гілку, потім спробував відновити оригінальну гілку з тим самим іменем, використовуючи 'git checkout -b lostbranchname', і git каже "помилка: не вдається вирішити посилання refs / heads / lostbranchname: Немає помилки, фатально: Не вдалося щоб заблокувати ref для оновлення: немає помилки ". "Без помилок" має бути особливо неприємною помилкою. Так виглядає, що він все ще висить навколо, але не може бути використаний і не може бути вбитий.

EDIT: Супер дупер о, дорогий. Я зробив купу розпакування та упаковки та заміни речей, як тут запропоновано: Як відновити об'єкти Git, пошкоджені збою жорсткого диска? , але тепер я отримую ще один хеш, про який повідомляють як про корупцію, за щось таке нешкідливе, як "git status". Я думаю, вся справа в шлангу. Гіт прекрасний і все, але я не повинен мати справу з подібними справами.


Що стосується git checkout -b lostbranchname- якщо ви дбаєте лише про назву гілки (а не про її вміст), ви можете її вручну видалити (або перейменувати) .git/refs/heads/lostbranchname- це, сподіваємось, зробить трюк.
Ентоні Хетчкінс

1
А у вас немає потоку, куди ви натискаєте цю папку git?
Лакшман Прасад

1
На жаль, це насправді своєрідне сховище сурогатів для неповноцінної системи управління джерелами, я просто використовую його локально, щоб отримати всі функції та принади git без клопоту іншої системи. Але принаймні інша система не випадково пошкоджує себе. Але це означає, що все, що я втратив, - це зміни, які я востаннє зареєстрував в іншій системі, яку я вже відновив. Час запустити новий сховище!
Бен Хімерс

7
Я б вагався сказати, що git змусив вас "мати справу з подібними речами" або що він зіпсував себе. Ніщо, крім резервної копії, не може бути повністю стабільним щодо втрати даних.
Каскабель

1
Я знаю насправді, я просто (природно) трохи заплутався, що втратив свою гарну історію. Це не помилка git, будь-яка інша система поводитиметься так само, як і дані помилки файлової системи.
Бен Хімерс

Відповіді:


135

Замість того, щоб залишити це відкритим, я думаю, я дам відповідь на власне запитання. Використання git reflog --all- це хороший спосіб перегляду осиротілих зобов’язань - і за допомогою хешів SHA1 ви можете реконструювати історію.

У моєму випадку сховище було пошкоджене, тому це не допомогло; git fsckможе допомогти вам знайти та інколи виправити помилки в самому сховищі.


3
Дякую. Це єдине місце, в якому я знайшов цю інформацію, намагаючись витягнути запит на осиротіло тягнути на github. Вирішив мою проблему.
SystemParadox

6
на випадок, якщо хтось захоче все в gitk: [alias] orphank = !gitk --all --date-order ``git reflog | cut -c1-7``&(редагувати: уявіть собі ті подвійні задні позиції, де одиночні - втеча, схоже, не працює тут)
mbx

1
Дивовижна порада @mbx! Дуже корисно, щоб ми могли графічно бачити зв’язки між сиротами.
Бен Хімерс

@BenHymers Було б круто, якби ми змогли отримати пунктирні рядки і для відносин, що нагадують "rebase / squash". Я ще не знайшов способу зробити це.
mbx

Я не знав про рефлог, коли писав відповідь вище. Це такий корисний інструмент!
Джеймі Хікс

17

З git 2.9.x / 2.10 (Q3 2016) вам більше не доведеться користуватися git reflog --all, git reflogбуде достатньо.

Див. Запис 71abeb7 (03 червня 2016 р.) Від SZEDER Gábor ( szeder) .
(Об’єднано Хуніо С Хамано - gitster- у комітеті 7949837 , 06 липня 2016 р.)

reflog: продовжуйте ходити за reflogостанніми коренями

Якщо репозиторій містить більше одного кореневого коміту, то його рефлог HEAD може містити кілька "подій створення", тобто записів, значенням "від" яких є null sha1.
Перерахування такого рефлогу в даний час передчасно зупиняється при першому такому записі, навіть коли рефлоґ все ще містить старі записи.
Це може налякати користувачів на думку про те, що після рефлогу їх урізаний після " git checkout --orphan".

Продовжуйте проходити рефлогування минулих подібних подій створення на основі "нового" значення попереднього запису.


4

Однією з хороших особливостей git є те, що він виявляє корупцію. Однак він не включає виправлення помилок для захисту від корупції.

Я сподіваюся, що ви перемістили вміст цього сховища на іншу машину або у вас є резервні копії для відновлення пошкоджених частин.

У мене немає досвіду роботи з git на Windows, але я ніколи не бачив подібної поведінки з git на Linux або OS X.


3

Я, як правило, вважаю git reflogвихід заплутаним. Набагато простіше мені зрозуміти графік фіксації git log --graph --reflog. Перезапис формату для відображення лише зведення з фіксацією також може полегшити наступний графік:

$ git alias graph "log --graph --all --format='%h %s%n        (%an, %ar)%d' --abbrev-commit
$ git graph --reflog

* f06abeb Add feature
|         (Sue Dakota, 4 days ago) (HEAD -> master)
* f126291 Fix the build
|         (Oski M. Wizard, 5 days ago) (origin/master, master)
* 3c4fb9c Break the build
|         (Alyssa P. Hacker, 5 days ago)
| * e3124bf fixup! More work for feature
| |         (Sue Dakota, 4 days ago)
| | * 6a7a52e Lost commit
| |/          (Sue Dakota, 4 days ago)
| * 69d9438 More work for feature
| |         (Sue Dakota, 2 weeks ago)
| * 8f69aba Initial work for feature
|/          (Sue Dakota, 3 weeks ago)
* d824fa9 Fix warnings from the linter
|         (Theo Ristudent, 4 weeks ago)
* 9f782b8 Fix tests flakes
|         (Tess Driven, 5 weeks ago)

З цього стає ясно , що e3124bfі 6a7a52eє сиротами без посилань, і є контекст від їхніх предків фіксацій.


Щойно врятував мене години втраченої роботи! випадково видалили локальну гілку, на якій було розміщено комісії, git reflog --allне показує їх, git log --graph --reflogвони були дуже видні ...
Adam.Er8
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.