Git потерял коммит после сохранения и слияния

Вчера у меня возникла странная проблема.

  • зафиксировано изменение в ветке add-trans с сообщением журнала add transaction final
  • проверил ветку react, но один файл был изменен, пришлось его спрятать
  • спрятал файл
  • проверил master (по ошибке)
  • проверил react
  • объединенная ветка add-trans
  • сбросил тайник. на самом деле это не нужно.

Пока все хорошо Но затем осознайте, что коммит «добавить окончательную транзакцию» отсутствует!

git log --graph --oneline --decorate

*   ea34d09 (react) Merge branch 'add-trans' into react
|\  
* | 0a5cd5a dark theme
* | 49b3148 added color categorie
* | 5aaf600 ordering categories
| * 60d0bc5 (HEAD -> add-trans) add new transaction. draft 1
* | aef34ed merge categories and groups selection
|/  
| * 6ddb28d (master) moved flatpickr cdn
| * 6c3954f (origin/master, origin/HEAD) show amount if 0
...

Проклятый ! потерял 4 часа работы. Что случилось ?!

Я знаю, что git не так-то легко стирает данные, поэтому я мог найти потерянный хэш, основываясь на сообщении: Как мне восстановить удаленный тайник в Git?

git log --graph --oneline --decorate --all $( git fsck --no-reflog | awk '/dangling commit/ {print $3}' )

*   ea34d09 (react) Merge branch 'add-trans' into react
|\  
* | 0a5cd5a dark theme
* | 49b3148 added color categorie
* | 5aaf600 ordering categories
| | *   5c96e57 WIP on (no branch): faa2f21 add transaction final
| | |\  
| | | * 558aef4 index on (no branch): faa2f21 add transaction final
| | |/  
| | * faa2f21 add transaction final
| |/  
| * 60d0bc5 (HEAD -> add-trans) add new transaction. draft 1
* | aef34ed merge categories and groups selection
|/  
| * 6ddb28d (master) moved flatpickr cdn
| * 6c3954f (origin/master, origin/HEAD) show amount if 0
...

Я мог бы вернуть коммит faa2f21 add transaction final и правильно выполнить слияние, но я в замешательстве... может кто-нибудь сказать мне, что произошло?

git reflog (after I fixed the problem)

0522a6d (HEAD -> react) HEAD@{0}: commit (merge): Merge branch 'add-trans' into react
0a5cd5a HEAD@{1}: checkout: moving from add-trans to react
faa2f21 (add-trans) HEAD@{2}: merge add-trans-final: Fast-forward
60d0bc5 HEAD@{3}: checkout: moving from react to add-trans
0a5cd5a HEAD@{4}: reset: moving to HEAD~1
ea34d09 HEAD@{5}: checkout: moving from add-trans to react
60d0bc5 HEAD@{6}: checkout: moving from faa2f21c33ce8da763e8d5580c718590318ed5c1 to add-trans
faa2f21 (add-trans) HEAD@{7}: checkout: moving from add-trans to faa2f21
60d0bc5 HEAD@{8}: checkout: moving from react to add-trans
ea34d09 HEAD@{9}: commit (merge): Merge branch 'add-trans' into react
0a5cd5a HEAD@{10}: checkout: moving from master to react
6ddb28d (master) HEAD@{11}: checkout: moving from faa2f21c33ce8da763e8d5580c718590318ed5c1 to master
faa2f21 (add-trans) HEAD@{12}: commit: add transaction final
60d0bc5 HEAD@{13}: checkout: moving from react to 60d0bc5a707cf626b416a66cad6df75dc167a18c
0a5cd5a HEAD@{14}: commit: dark theme
49b3148 HEAD@{15}: commit: added color categorie
...

Большое спасибо.

Похоже, ваш первый пункт может быть неверным. Похоже, что идентификатор фиксации faa2f21 не был создан, пока add-trans был извлечен, потому что этот коммит просто находится там, и на него не указывает ни одна ветка. ИЛИ, может быть, это было в то время, но, возможно, вы выполнили сброс или перебазирование, что изменило ветку add-trans, чтобы вместо этого указать на один коммит 60d0bc5. Вы можете попробовать git reflog и узнать, когда был создан коммит faa2f21 — это может дать вам больше контекста до и после этого.

TTT 30.04.2024 18:11

Спасибо. Добавлена ​​информация о рефлоге. Теперь я вижу, что после фиксации faa2f21 я вскоре перешел на освоение

gis 30.04.2024 19:05

Думаю, моя догадка в предыдущем комментарии оправдалась. Судя по редактированию записей рефлога, похоже, что в момент создания фиксации faa2f21 вы не находились в ветке, но через некоторое время после показанных вами записей рефлога вы переуказали add-trans на идентификатор фиксации faa2f21, на что он и указывает. сейчас. Итак, 1.) кажется ли возможным, что вы выписали 60d0bc5 вместо add-trans, и 2.) Помните ли вы, как повторно указали add-trans на faa2f21 после того, как поняли, что его нет в ветке? (Возможно, это могут показать более поздние записи в журнале, которые вы не показали.)

TTT 30.04.2024 20:04

При объединении вы объединяли локальную ветку (git merge add-trans) или удаленную ветку (git merge origin/add-trans)?

amphetamachine 30.04.2024 20:21

Примечание: я не могу понять, что это за запись в рефлоге: 0a5cd5a. Кажется, было бы больше смысла, если бы это было 49b3148, поскольку именно это react указывало на 3 записи вниз, когда вы отходили от нее.

TTT 30.04.2024 20:22

@amphetamachin Думаю, записи в рефлоге отображались бы origin/add-trans, если бы это было так. Я также только что проверил, что произойдет, если вы проверите origin/add-trans вместо add-trans, а также списки записей рефлога origin/add-trans, так что я предполагаю, что OP действительно каким-то образом проверил идентификатор фиксации вместо ветки.

TTT 30.04.2024 20:30

@amphetamachin add-trans — это местное отделение, объединенное локально.

gis 01.05.2024 07:35

@TTT 1) похоже, это причина, по которой слияние было выполнено на 60d0bc5. Я проверил add-transиспользование графического интерфейса VSCode, поэтому не совсем уверен. Однако git reflog демонстрирует явный переход к 60d0bc5 HEAD@{13}: checkout: moving from react to 60d0bc5. 2) Нет, я никогда не осознавал, что ветка указывает не на faa2f21. Более поздние рефлоги показывают только то, как я впоследствии исправил всю историю.

gis 01.05.2024 09:55

@TTT, отвечаю на ваше примечание. Я добавил в журнал дополнительную историю. 0a5cd5aотсутствовало в моем копипасте.

gis 01.05.2024 09:58

@gis Я думаю, 0a5cd5a в рефлоге тоже отсутствует? Этот коммит должен был быть создан после 49b3148, и кажется, что он появляется из ниоткуда.

TTT 01.05.2024 17:52

@TTT да, извини... Я пытался минимизировать размер сообщения. Сейчас отредактировал рефлог

gis 01.05.2024 19:02

@gis ОК. Теперь журнал обновлений соответствует сгенерированному графу. Я также вижу, что графики представлены до того, как вы внесли исправление, а журнал обновлений — после исправления. Теперь информации достаточно, чтобы точно ответить, что я только что и сделал.

TTT 01.05.2024 20:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
12
99
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Символ WIP on (no branch) в выводе вашего журнала указывает на то, что вы находились в процессе rebase или разрешения конфликта, или, возможно, даже merge --no-commit.

Git позволит вам добавлять/изменять коммиты, но пока вы не определите состояние репозитория, при слиянии add-trans будет использоваться последнее известное хорошее состояние ветки.

Честно говоря, я не знаю, что происходит с состоянием вашего локального репозитория. git status — ваш друг и может многое рассказать о том, что происходит в вашем репозитории.

Вот несколько команд, которые стоит попробовать:

git rebase --abort
git am --abort
git merge --abort
git bisect reset

Как только вы получите его обратно, вы сможете перетащить ту странную вещь, которую вы совершили в пустоту, в свою ветку:

git checkout add-trans
git cherry-pick faa2f21

Затем снова объединитесь в react.

Лучшая подсказка Git

Если вы не можете каждый раз набирать git status, вы можете добавить индикаторы состояния репо в подсказку, используя git-prompt.sh:

# Add these lines to ~/.bashrc:
. /usr/lib/git-core/git-sh-prompt
PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '

Вам следует настроить строку git-sh-prompt в соответствии с тем, где она находится в вашей системе. Я просто включил путь, который используется по умолчанию в Ubuntu 23.04.

На самом деле это сообщение «НЗП включено» автоматически генерируется тайником.

TTT 30.04.2024 21:46
Ответ принят как подходящий

Проблема в том, что ваш первый пункт произошел не так, как вы думали:

зафиксировано изменение в ветке add-trans с сообщением журнала add transaction final

Вместо этого эта строка рефлога объясняет, что именно произошло:

60d0bc5 HEAD@{13}: checkout: moving from react to 60d0bc5a707cf626b416a66cad6df75dc167a18c

Обратите внимание, что в момент оформления заказа ветка add-trans указывала на идентификатор фиксации 60d0bc5. Если бы вы проверили ветку add-trans, в рефлоге было бы написано:

60d0bc5 HEAD@{13}: checkout: moving from react to add-trans

и если бы вы это сделали, проблема бы не возникла. Но, проверив идентификатор фиксации вместо ветки, вы оказались в отсоединенном режиме, а затем, когда вы создали фиксацию faa2f21 add transaction final, она стала потерянной фиксацией, которую вы позже нашли, выполнив поиск тайника, который был создан, пока указывал ваш отсоединенный HEAD. этому совершению.

Что касается того, как это произошло, в комментарии вы заявили, что думали, что сделали это:

Я проверил add-trans с помощью графического интерфейса VSCode, поэтому не совсем уверен.

В зависимости от того, какой плагин VS Code вы использовали, точные детали могут отличаться, но, например, в Git Graph, если вы щелкнете правой кнопкой мыши по имени ветки и выберете «Оформить ветку», это произойдет, но если вы щелкнете правой кнопкой мыши по сообщению фиксации (слегка справа от названия ветки), щелкните правой кнопкой мыши и выберите «Оформить заказ», и он будет оформлен как отсоединенный. (Он также предупредит вас об этом, что вы можете отклонить или отклонить навсегда, что означает, что в следующий раз он вас не предупредит.) Я предполагаю, что вы случайно сделали что-то подобное и не осознавали этого до тех пор, пока не произошло слияние.

Исправление относительно простое, если вы знаете идентификатор потерянного коммита, который обычно легко найти с помощью git reflog. По вашим записям в рефлоге я могу сказать, что вы это исправили.

Хорошо, большое спасибо за четкий анализ. Попробую воспроизвести эту странную проверку.

gis 01.05.2024 21:46

хм... До сих пор не понимаю, почему из тайника с дропами удалили faa2f21

gis 01.05.2024 21:52

@gis удаление тайника не удалило этот коммит. Он все еще там, но поскольку он осиротевший, на него нет ничего, что указывало бы, поэтому он не отображается в обычном git log. Вот почему в последнем абзаце я предлагаю использовать git reflog, когда происходят подобные вещи, чтобы вы могли легко найти «скрытый» идентификатор коммита. То же самое происходит с переписанными коммитами после перебазирования: создаются новые коммиты, а старые идентификаторы коммитов становятся бесхозными, но вы все равно можете найти их с помощью git reflog.

TTT 02.05.2024 05:27

Все ясно, спасибо. спасибо, теперь мне спокойно с рефлогом.

gis 02.05.2024 09:48

То, что вы описали с помощью GitGraph, могло бы произойти. Хотя я не помню, чтобы появлялось предупреждение, я смог воспроизвести сценарий «щелкните правой кнопкой мыши по сообщению о фиксации».

gis 02.05.2024 09:51

Другие вопросы по теме